【问题标题】:What does: "Cannot commit when autoCommit is enabled” error mean?什么是:“启用自动提交时无法提交”错误是什么意思?
【发布时间】:2011-08-03 01:04:43
【问题描述】:

在我的程序中,池中有几个线程,每个线程都尝试写入数据库。创建的线程数是动态的。当创建的线程数只有一个时,一切正常。但是,当有多线程执行时,我得到了错误:

org.apache.ddlutils.DatabaseOperationException: org.postgresql.util.PSQLException: Cannot commit when autoCommit is enabled.

我猜,也许是因为每个线程都是并行执行的,所以两个线程试图同时写入并给出这个错误。

您认为是这种情况吗,如果不是,是什么导致了这个错误?

否则,如果我说的是问题,我能做些什么来解决它?

【问题讨论】:

    标签: database postgresql


    【解决方案1】:

    在您的 jdbc 代码中,您应该在获取连接后立即关闭自动提交。像这样的:

    DataSource datasource = getDatasource(); // fetch your datasource somehow
    Connection c = null;
    try{
      c = datasource.getConnection();
      c.setAutoCommit(false);
    

    【讨论】:

    • thnx 这行得通.. 但您能否解释一下为什么行得通,以及这种方式是否有任何缺点?!
    • 当然。 Autocommit 是一种数据库连接设置,只要执行 DML 语句(UPDATE、INSERT 或 DELETE),它就会自动开始并提交数据库事务。这简化了某些编程任务并减少了简单数据库操作所需的样板。但是,如果您正在运行多个相关语句并且您想确保它们都成功(即,如果它们中的任何一个失败或抛出异常,那么它们都不会生效)您将需要关闭自动提交并手动开始/提交事务你自己,这也更有效率。
    • 好的,所以这只是交易需要...不是正常更新?就像在我的线程中一样,我最后不会调用commit()
    • 如果您不调用commit,您所做的任何更改都不会保存到数据库中。完成更改后,您应该致电commit()
    猜你喜欢
    • 2017-02-05
    • 2019-01-23
    • 2018-03-20
    • 2018-08-23
    • 2016-06-12
    • 1970-01-01
    相关资源
    最近更新 更多