gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:27:10 25 4
gpt4 key购买 nike

我有一种方法可以创建与嵌入式 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com