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

前端之家收集整理的这篇文章主要介绍了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相关文章