Java 禁用数据库连接上的自动提交会产生什么影响?
如果我将连接设置为手动提交,是否意味着我的进程将锁定数据库?如果我必须执行可能需要4-5个小时才能执行的多个SQL查询,这是否意味着在此期间没有其他用户可以访问我的数据库 我以web应用程序的场景为例,其中有数千个用户访问同一个数据库Java 禁用数据库连接上的自动提交会产生什么影响?,java,sql,Java,Sql,如果我将连接设置为手动提交,是否意味着我的进程将锁定数据库?如果我必须执行可能需要4-5个小时才能执行的多个SQL查询,这是否意味着在此期间没有其他用户可以访问我的数据库 我以web应用程序的场景为例,其中有数千个用户访问同一个数据库 connection.setAutoCommit(false); //multiple sql query that will probably take 4-5 hours to be executed connection.commit(); connec
connection.setAutoCommit(false);
//multiple sql query that will probably take 4-5 hours to be executed
connection.commit();
connection.setAutoCommit(false);表示您正在启动此连接上的事务。您将在此连接中对DB表所做的所有更改将在提交时保存,或在回滚时恢复(或在不提交的情况下断开连接)。这并不意味着锁定整个数据库。其他用户在尝试访问事务使用的表时是否会被锁定取决于事务正在执行的操作和事务隔离级别。将autocommit设置为false通常不会对读取产生影响,因此,如果您正在运行的是这类查询,应该不会有问题 autocommit=false保证您将在事务中执行查询(插入、删除、更新),这意味着它们要么全部成功(最后提交),要么失败并回滚 当您插入、更新或执行
操作时,请选择。。。对于update
,某些行将被锁定,这很难预测,因为这取决于您的引擎、Mysql版本、隔离级别等
例如,如果autocommit=false并且两个用户需要同时更新相同的行,那么一个将被锁定,等待第一个行完成,并执行提交或回滚操作
比如说,USER1会触发数据库的更新,目标是10行
你开始交易,做更新,再做几个查询
在提交/回滚之前,USER2触发相同的更新,或者将针对USER1正在更新的一个或多个相同行的更新
USER2将被锁定,等待USER1提交或回滚,然后才能执行更新
测试这一点的一种方法是打开到数据库的两个不同连接,例如,通过命令行或其他客户机,并模拟这种行为。
将autocommit设置为false,在一个客户机上执行更新,在第二个客户机上执行相同的操作,直到在第一个客户机上提交或回滚为止
这项技术可以非常方便地帮助您了解幕后发生的事情。这取决于隔离级别和您正在做的事情: 如果您正在阅读:
- 脏读/已提交读取:不会影响其他任务
- 可重复阅读:其他阅读任务不会受到影响。其他写作任务可能会受到影响。(取决于实施情况)
- 序列化:其他阅读任务不会受到影响,而写作任务会受到影响
如果您正在执行更新,其他任务将受到影响。一般来说,您不应该在长时间运行的事务中进行更新。但是谁负责设置默认事务隔离级别?可能是选择的db连接器?(这个问题是为了另一个被删除的评论)