java - 当事务仍处于 Activity 状态时无法关闭连接 connection.close() 上出现异常

标签 java hibernate database-connection derby

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

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:事务仍处于 Activity 状态时无法关闭连接。

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

但是我真的需要为 Select 操作调用 commit() 吗?有什么要 promise 的?是否有某个地方有一个锁,如果我不提交就不会被释放?

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

我错过了什么?

最佳答案

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

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

这是一些背景 Material :

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

关于java - 当事务仍处于 Activity 状态时无法关闭连接 connection.close() 上出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36666686/

相关文章:

java - Hotspot 中的逃逸分析在简单情况下有多脆弱,例如 for-each 循环中的迭代器

java - 如何通过.class获取泛型类型?

hibernate - JPA EntityGraph,使用静态元模型以编程方式创建 PluralAttribute 的子图

mysql - 如何计算MySQL语句的大小(不是查询结果)

java - 如何将 odbc 数据库连接到我的 java 代码?

java - Android 中的 "Activity not found"

java - Docker-compose:/app.war 中没有主要 list 属性

java - 使用 Jackson 注释将对象序列化为 XML

java - Broadleaf - 创建动态产品异常(exception)

java - 在 Java 中的数据库之间切换