首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁用自动提交对数据库连接有什么影响?

禁用自动提交对数据库连接有什么影响?
EN

Stack Overflow用户
提问于 2013-04-23 19:21:33
回答 3查看 6.6K关注 0票数 7

如果我将连接设置为手动提交,这是否意味着我的进程将锁定数据库?如果我必须执行多个SQL查询,可能需要4-5个小时才能执行,这是否意味着在此期间没有其他用户可以访问我的数据库?

我采用的是web应用程序的场景,其中有数千个用户访问同一个数据库。

代码语言:javascript
复制
connection.setAutoCommit(false);
//multiple sql query that will probably take 4-5 hours to be executed

connection.commit();
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-23 19:28:55

将自动提交设置为false通常对读取没有影响,所以如果这是您正在运行的查询类型,应该不会有问题。

autocommit=false所保证的是,您将在一个事务中执行查询(插入、删除、更新),这意味着它们要么全部成功(最后提交),要么全部失败并被回滚。

当您插入、更新或执行select ... for update时,某些行将被锁定,这很难预测,因为这取决于您的引擎、Mysql版本、隔离级别等。

例如,如果autocommit=false和两个用户需要同时更新相同的行,那么一个将被锁定,等待第一个提交或回滚完成。

假设USER1在您的数据库上触发了一个针对10行的更新。

你开始交易,做更新,做更多的查询...

在commit/rollback之前,USER2会触发相同的更新,或者触发针对USER1正在更新的同一行中的一个或多个的更新。

USER2将被锁定,等待USER1提交或回滚,然后才能执行更新。

测试的一种方法是打开两个不同的数据库连接,例如,通过命令行或其他客户端,并模拟此行为。将自动提交设置为false,在一个客户端上执行更新,在第二个客户端上执行相同的操作,并看到它挂起,直到您在第一个客户端上提交或回滚。

这项技术可以非常方便地帮助您了解幕后发生的事情。

票数 14
EN

Stack Overflow用户

发布于 2013-04-23 19:26:48

connection.setAutoCommit(false);表示您正在此连接上启动事务。您将对此连接中的DB表所做的所有更改将在提交时保存,或在回滚时恢复(或在未提交的情况下断开连接)。这并不意味着你锁定了整个数据库。其他用户在尝试访问您的事务使用的表时是否会被锁定,将取决于您的事务正在执行的操作和事务隔离级别。

票数 6
EN

Stack Overflow用户

发布于 2013-04-23 19:48:38

这取决于隔离级别和您正在执行的操作:

如果你正在阅读:

affected

  • Repeatable Read:
  • Dirty Read / Read Commited:没有其他任务将被Dirty Read:其他读取任务不会受到影响。其他写作任务可能会受到影响。(实现dependent)
  • Serialization:其他读取任务不会受到影响,写入任务会受到影响。

如果您正在进行更新,其他任务将受到影响。一般来说,你不应该在长时间运行的事务中进行更新。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16168055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档