如果我将连接设置为手动提交,这是否意味着我的进程将锁定数据库?如果我必须执行多个SQL查询,可能需要4-5个小时才能执行,这是否意味着在此期间没有其他用户可以访问我的数据库?
我采用的是web应用程序的场景,其中有数千个用户访问同一个数据库。
connection.setAutoCommit(false);
//multiple sql query that will probably take 4-5 hours to be executed
connection.commit();发布于 2013-04-23 19:28:55
将自动提交设置为false通常对读取没有影响,所以如果这是您正在运行的查询类型,应该不会有问题。
autocommit=false所保证的是,您将在一个事务中执行查询(插入、删除、更新),这意味着它们要么全部成功(最后提交),要么全部失败并被回滚。
当您插入、更新或执行select ... for update时,某些行将被锁定,这很难预测,因为这取决于您的引擎、Mysql版本、隔离级别等。
例如,如果autocommit=false和两个用户需要同时更新相同的行,那么一个将被锁定,等待第一个提交或回滚完成。
假设USER1在您的数据库上触发了一个针对10行的更新。
你开始交易,做更新,做更多的查询...
在commit/rollback之前,USER2会触发相同的更新,或者触发针对USER1正在更新的同一行中的一个或多个的更新。
USER2将被锁定,等待USER1提交或回滚,然后才能执行更新。
测试的一种方法是打开两个不同的数据库连接,例如,通过命令行或其他客户端,并模拟此行为。将自动提交设置为false,在一个客户端上执行更新,在第二个客户端上执行相同的操作,并看到它挂起,直到您在第一个客户端上提交或回滚。
这项技术可以非常方便地帮助您了解幕后发生的事情。
发布于 2013-04-23 19:26:48
connection.setAutoCommit(false);表示您正在此连接上启动事务。您将对此连接中的DB表所做的所有更改将在提交时保存,或在回滚时恢复(或在未提交的情况下断开连接)。这并不意味着你锁定了整个数据库。其他用户在尝试访问您的事务使用的表时是否会被锁定,将取决于您的事务正在执行的操作和事务隔离级别。
发布于 2013-04-23 19:48:38
这取决于隔离级别和您正在执行的操作:
如果你正在阅读:
affected
如果您正在进行更新,其他任务将受到影响。一般来说,你不应该在长时间运行的事务中进行更新。
https://stackoverflow.com/questions/16168055
复制相似问题