java – 数据源的自动提交应该设置为false吗?

请参阅Spring DataSourceTransactionManager.java中的注释,函数doBegin:

// Switch to manual commit if necessary. This is very expensive in some JDBC drivers,// so we don't want to do it unnecessarily (for example if we've explicitly
// configured the connection pool to set it already).
        if (con.getAutoCommit()) {
            txObject.setMustRestoreAutoCommit(true);
            if (logger.isDebugEnabled()) {
                logger.debug("Switching JDBC Connection [" + con + "] to manual commit");
            }
            con.setAutoCommit(false);
        }

在我正在进行的项目中,未配置自动提交.所以默认情况下是这样.我们使用Spring来管理事务,所有SQL都在@Transactional注释函数中执行.因此,事务是手动提交的.每次事务开始时,db连接都将autocommit设置为false,并在事务退出后将autocommit设置回true.典型的工作流程是(在JDBC级别):

> conn = dataSource.getConnection();
> conn.setAutoCommit(false);
> stmt = conn.createStatement();
> stmt.executeQuery(…);
> conn.commit()/ conn.rollback();
> conn.setAutoCommit(true);

设置autocommit来回昂贵吗?我们应该为性能原因配置数据源连接池autocommit = false吗?跳过第2步和第6步.

最佳答案
1)autocommit完全依赖于数据库,这意味着,通过连接的每个语句都将在一个隐含执行的单独事务中执行.除非和直到,您希望使用个人编码并避免由多个语句持有的这些锁可能导致与其他用户冲突,因此无需将自动提交设置为false.

2)从绩效的角度来看,

a)如果你有很多用户,并且由于持有数据库锁而发生了一些冲突,
    那么,可能需要检查与之相关的问题,但作为一般情况
    规则,自动提交是为了简化初学者的东西而引入的.

b)可能存在需要回滚的情况.

c)您希望根据特定条件手动提交事务.

编辑:我看到你编辑了这个问题,简单回答你,autocommit = false会强迫你编写自己的提交/回滚/等,性能完全取决于数据库,实时锁定的数量!

编号将autocommit设置为false并再次为true将不会增加系统的收费.

不,不要配置数据源连接池autocommit = false,除非您出于某些特定原因并且是经验丰富的人员.从性能的角度来看,正如我已经十分认证的那样,它依赖于数据库的类型和实时用户访问实例的数据库,对于您的项目,99.99%的百分比您不需要将其设置为false.

将autocommit设置为true只会确保在每个语句之后调用commit.

我还看到你从数据源获得连接,在这种情况下,最好保留连接的默认设置,以便下次从池中获取连接时,工作流程不会有任何问题

希望这有帮助!!

相关文章

在正式开始之前,我们先来看下 MySQL 服务器的配置和版本号信...
> [合辑地址:MySQL全面瓦解](https://www.cnblogs.c...
物理服务机的CPU、内存、存储设备、连接数等资源有限,某个时...
1 回顾 上一节我们详细讲解了如何对数据库进行分区操作,包括...
navicat查看某个表的所有字段的详细信息 navicat设计表只能一...
文章浏览阅读4.3k次。转载请把头部出处链接和尾部二维码一起...