【问题标题】:Cannot close a connection while a transaction is still alive Exception on connection.close()事务仍处于活动状态时无法关闭连接 connection.close() 上的异常
【发布时间】:2016-04-17 02:41:41
【问题描述】:

我有一个方法可以创建与嵌入式 Derby 数据库的连接并对其执行 Select 查询。

public PersonMID findPersonMID(String personAlias, CodeUID aliasTypeCodeUID, LogicalDomainMID logicalDomainMID) throws SQLException
{
    Connection connection = getConnection();

    try
    {
        QueryExecutor<Long> findPersonIdByPersonAliasExecutor = FindPersonIdByPersonAliasDelegate.getExecutor(authority,connection, personAlias);

        Long result = findPersonIdByPersonAliasExecutor.execute();

        if(result == null)
        {
            return null;
        }
        return PersonMID.create(authority, result);
    }
    finally
    {
        JDBCAssistant.close(connection);
    }

这是我的查询的样子:

select P.PRSON_ID from PRSON_ALIAS PA join PRSON P on P.PRSON_ID = PA.PRSON_ID and P.LOGICAL_DOMAIN_ID = ? where PA.PRSON_ALIAS_TYPE_CD = ? and    PA.ALIAS = ?

当我运行这段代码时,我得到一个异常 JDBCException: java.sql.SQLException: Cannot close a connection while a transaction is still active.

但是,当我在关闭 Connection 之前调用 Connection.commit() 或设置 autoCommit true(我的 Connection 默认设置为 false)我的 Connection 时,它允许我成功关闭连接并获得所需的结果。

但是我真的需要致电commit() 进行Select 操作吗?有什么可承诺的?如果我不提交,是否有没有被释放的锁?

post 说我不应该这样做。我应该能够关闭我的连接而无需提交或回滚。

我错过了什么?

【问题讨论】:

  • 如果你用 connection.setAutoCommit(true) 强制自动提交模式会发生什么?
  • @NicolasFilotto 在这种情况下,我可以关闭连接而不会出现任何错误。
  • 所以我怀疑在 derby 的全局配置中,这不再是默认启用的自动提交模式。 getAutoCommit() 获取连接后返回什么?或者如果方法 getConnection() 可能没有错
  • 如果根据选择的隔离级别没有处于自动提交模式,则与查询匹配的记录可能会被锁定,直到您提交事务以释放锁定
  • 不,如果你真的处于自动提交模式,你不需要提交任何东西,这就是为什么我想知道 getAutoCommit() 的值

标签: java hibernate database-connection derby


【解决方案1】:

如果您不是处于autoCommit 模式,那么SELECT 语句实际上持有读锁,具体取决于您的隔离级别,因此提交SELECT 查询比无操作。

是的,数据库没有变化,但提交仍然告诉数据库引擎您的事务已经完成了对数据的查看,因此它可以允许其他事务修改数据。

这里有一些背景资料:

  1. 隔离级别和并发; https://db.apache.org/derby/docs/10.12/devguide/cdevconcepts15366.html
  2. 共享锁:https://db.apache.org/derby/docs/10.12/devguide/cdevconcepts842304.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 2020-04-12
    相关资源
    最近更新 更多