1

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

下面是预言机的解释:

语句 con.setAutoCommit(true); 启用自动提交模式,这意味着每个语句在完成时再次自动提交。然后,您将返回到默认状态,您不必自己调用方法提交。建议仅在事务模式期间禁用自动提交模式。这样,您可以避免为多个语句持有数据库锁,这会增加与其他用户发生冲突的可能性。

能不能换个说法解释一下?特别是这一点:

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

“为多个语句持有数据库锁”是什么意思?

提前致谢。

4

4 回答 4

1

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

于 2013-05-20T14:53:29.717 回答
1

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

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

于 2013-05-20T14:53:44.443 回答
1

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

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

于 2013-05-20T14:54:32.633 回答
1

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

但是,有时您需要对数据库执行多项更改,这些更改必须一次完成,如果其中一项更改失败,您希望全部撤消。

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

为了实现这一点,你autoCommit 关闭,执行语句,提交它们,然后autoCommit重新打开。这最后一次打开autoCommit可能就是您所看到的。

于 2013-05-20T14:57:18.693 回答