setAutocommit(true)进一步解释

时间:2013-05-20 14:47:47

标签: java jdbc commit

我遇到了this oracle java教程。作为该主题的初学者,我无法理解为什么在交易结束时需要设置con.setAutocommit(true);

这是oracle的解释:

  

声明con.setAutoCommit(true);启用自动提交模式,其中   表示每个语句在以后再次自动提交   它完成了。然后,您将回到默认状态   不必自己调用方法提交。建议   仅在事务模式下禁用自动提交模式。这个   你避免为多个语句保存数据库锁,这一点   增加与其他用户发生冲突的可能性。

换句话说,你能解释一下吗?特别是这一点:

  

这样,您可以避免为多个语句保存数据库锁,   这增加了与其他用户发生冲突的可能性。

“为多个语句保存数据库锁”意味着什么?

提前致谢。

4 个答案:

答案 0 :(得分:1)

当一个事务更新数据库中的一行时,其他事务在第一行完成(提交或回滚)之前不能更改此行,因此如果您不需要事务,建议设置con.setAutocommit(true)

答案 1 :(得分:1)

对于大多数现代数据库系统,您可以将一系列SQL语句批处理在一起。通常,您关心的是插入,因为这些将阻止正在写入的磁盘上的一部分空间。在JDBC中,这类似于Statement.addBatch(sql)。现在,当您尝试对数据库中的元组实施悲观或乐观锁定时,这会成为问题。因此,如果您有一系列执行多个批次的长时间运行的事务,您可能会发现自己处于由于这些独占锁而拒绝所有读取的情况。我相信在Oracle中没有脏读的东西,所以这可能会减轻。但想象一下,在我更新它时,您正在运行尝试删除记录的作业的场景,这是他们所指的冲突类型。

启用自动提交后,批量的每个部分都会保存,然后再转到下一个工作单元。这是您在尝试保留数百万条记录时所看到的,并且它会大大减慢。因为系统确保每个插入语句的一致性。在Oracle中有一种快速解决此问题的方法(如果您使用的是oracle)是使用oracle.sql包并查看ARRAY类。

答案 2 :(得分:1)

数据库必须执行行级或表级锁定(基于MySQL中的数据库引擎)来处理事务。如果保持auto-commit模式off并继续执行语句,则在提交事务之前不会释放这些锁。根据类型,其他事务将无法更新当前锁定的行/表。 setAutocommit(true)基本上提交当前事务,释放当前持有的锁,并启用auto-commit,也就是说,在进一步需要之前,每个单独的语句都被执行并提交。

行级锁保护参与事务的各个行(InnoDB)。表级锁防止并发访问整个表(MyIsam)。

答案 3 :(得分:1)

默认情况下,大多数数据库都会autoCommit。这意味着只要您执行一条语句,结果就会立即出现在数据库中,其他所有使用数据库的人都会立即看到它们。

但是,有时候,您需要对数据库执行一些必须同时完成的更改,如果一个更改,则您希望退出所有更改。

假设您有一个汽车数据库,并且您遇到了来自新制造商的新车。在这里,您可能希望在数据库新车记录中创建制造商条目,并确保它们同时出现在其他用户中。否则,数据库中可能存在令人困惑的时刻,其中一个存在而没有另一个。

要实现此目的,请切换autoCommit 关闭,执行语句,提交它们,然后重新设置autoCommitautoCommit的最后一次开启可能就是你所看到的。