【发布时间】:2009-10-07 05:38:00
【问题描述】:
我不太确定 java JDBC 的自动提交模式,我正在建立一个自动提交模式设置为 false 的连接。之后,我在数据库上触发了一个选择查询,它工作正常,我的印象是只能为插入、更新、删除语句调用提交。
现在我需要为 Select 查询提交连接吗?如果没有,该表是否会被锁定以供其他事务使用?
谢谢, 罗希特。
【问题讨论】:
我不太确定 java JDBC 的自动提交模式,我正在建立一个自动提交模式设置为 false 的连接。之后,我在数据库上触发了一个选择查询,它工作正常,我的印象是只能为插入、更新、删除语句调用提交。
现在我需要为 Select 查询提交连接吗?如果没有,该表是否会被锁定以供其他事务使用?
谢谢, 罗希特。
【问题讨论】:
这取决于您的隔离级别。如果您使用READ COMMITTED,则SELECT 仅在您指定SELECT FOR UPDATE 时创建锁。如果您使用REPEATABLE READ 或更高版本,则每个SELECT 都可以创建一个锁(取决于您的数据库模型)。
【讨论】:
REPEATABLE READ 隔离模型中,常规选择不会创建锁。隔离模式遵循未提交的更改和选择受此更改影响的数据的规则。
我不太确定 java JDBC 的自动提交模式,我正在建立一个自动提交模式设置为 false 的连接。之后,我在数据库上触发了一个选择查询,它工作正常,我的印象是只能为插入、更新、删除语句调用提交。
这取决于您的应用程序。如果有简单的更新、插入、删除,您可以离开autocommit=on。一般来说,建议关闭自动提交。该配置为您提供了更大的应用灵活性和功能。您可以使用复杂的交易,您可以决定交易的开始时间和结束时间。
现在我需要为 Select 查询提交连接吗?如果不是,该表是否会被锁定以供其他事务使用?
不,选择语句不会开始事务(插入、更新、删除),因此在选择语句之后无需提交/回滚。 select 有一种特殊情况,即锁定所选行并需要事务 - with for update clause
【讨论】:
Now do I need to commit the connection for Select query? If not will that table be locked for other transactions? - 我的答案是否/否。如果你不犯错就不会发生任何错误