【问题标题】:Autocommit false mode java自动提交假模式java
【发布时间】:2009-10-07 05:38:00
【问题描述】:

我不太确定 java JDBC 的自动提交模式,我正在建立一个自动提交模式设置为 false 的连接。之后,我在数据库上触发了一个选择查询,它工作正常,我的印象是只能为插入、更新、删除语句调用提交。

现在我需要为 Select 查询提交连接吗?如果没有,该表是否会被锁定以供其他事务使用?

谢谢, 罗希特。

【问题讨论】:

    标签: java jdbc


    【解决方案1】:

    这取决于您的隔离级别。如果您使用READ COMMITTED,则SELECT 仅在您指定SELECT FOR UPDATE 时创建锁。如果您使用REPEATABLE READ 或更高版本,则每个SELECT 都可以创建一个锁(取决于您的数据库模型)。

    【讨论】:

    • java.sun.com/j2se/1.3/docs/api/java/sql/… - 没有关于创建锁的选择语句。锁由 DML 语句创建
    • 如果您在 Oracle DB 上执行“SELECT FOR UPDATE”,如果第二个事务在同一记录上执行“SELECT FOR UPDATE”,则会阻塞(等待锁定)。
    • @tangens 我的意思是常规选择。我在我的回复中指出,无论如何选择更新创建锁。在REPEATABLE READ 隔离模型中,常规选择不会创建锁。隔离模式遵循未提交的更改和选择受此更改影响的数据的规则。
    【解决方案2】:

    我不太确定 java JDBC 的自动提交模式,我正在建立一个自动提交模式设置为 false 的连接。之后,我在数据库上触发了一个选择查询,它工作正常,我的印象是只能为插入、更新、删除语句调用提交。

    这取决于您的应用程序。如果有简单的更新、插入、删除,您可以离开autocommit=on。一般来说,建议关闭自动提交。该配置为您提供了更大的应用灵活性和功能。您可以使用复杂的交易,您可以决定交易的开始时间和结束时间。

    现在我需要为 Select 查询提交连接吗?如果不是,该表是否会被锁定以供其他事务使用?

    不,选择语句不会开始事务(插入、更新、删除),因此在选择语句之后无需提交/回滚。 select 有一种特殊情况,即锁定所选行并需要事务 - with for update clause

    【讨论】:

    • 这是不正确的。所有 JDBC 语句总是在事务上下文中执行,包括 SELECT。
    • 你确定吗?如果选择查询将开始事务,它将阻止其他选择的数据。 Select 可以在现有事务中运行,但不能开始新事务。
    • @cetnar - 我很肯定。针对数据库执行的任何语句(包括 SELECT)都在事务上下文中执行。任何语句(在某些情况下不包括 DDL)都可以在现有事务或在先前事务(如果有)已提交/回滚之后的新(单独)事务中运行。有关详细信息,请参阅 JDBC 教程 (java.sun.com/docs/books/tutorial/jdbc/basics/transactions.html) 或规范。
    • @ChssPly- 我试着更精确一些。有些选择语句需要提交或回滚(用于更新或 dbLink 选择)。 Java Connection 接口的实现不解析语句,因此在每个语句之后都是一个提交。从数据库方面来说,如果你提交一个常规的 select 语句,没有任何改变,所以我认为提交是不必要的。您在 SQLPlus 中选择后提交吗?问题是Now do I need to commit the connection for Select query? If not will that table be locked for other transactions? - 我的答案是否/否。如果你不犯错就不会发生任何错误
    猜你喜欢
    • 2017-11-05
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    相关资源
    最近更新 更多