Java 事务仍处于活动状态时无法关闭连接。连接上出现异常。关闭()
我有一个方法可以创建与嵌入式Derby数据库的连接,并对其执行Select查询Java 事务仍处于活动状态时无法关闭连接。连接上出现异常。关闭(),java,hibernate,database-connection,derby,Java,Hibernate,Database Connection,Derby,我有一个方法可以创建与嵌入式Derby数据库的连接,并对其执行Select查询 public PersonMID findPersonMID(String personAlias, CodeUID aliasTypeCodeUID, LogicalDomainMID logicalDomainMID) throws SQLException { Connection connection = getConnection(); try { QueryExe
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);
}
当我运行这段代码时,我得到一个异常
jdbception:java.sql.SQLException:事务仍处于活动状态时无法关闭连接。
但是,当我在关闭连接之前调用Connection.commit()
或为连接设置自动提交true
(默认情况下,我的连接设置为false
)时,它允许我成功关闭连接并获得所需的结果
但是我真的需要调用commit()
来执行Select
操作吗?有什么要做的?如果我不提交,是否有某个锁没有被释放
这说明我不应该这么做。我应该能够在不必提交或回滚的情况下关闭连接
我遗漏了什么?如果您不是处于自动提交
模式,那么SELECT
语句实际上持有读锁,这取决于您的隔离级别,因此提交SELECT
查询不仅仅是禁止操作
是的,数据库没有更改,但提交仍然会告诉数据库引擎您的事务已完成查看数据,因此它可以允许其他事务修改数据
以下是一些背景资料:
隔离级别和并发性李>
共享锁:
如果使用connection.setAutoCommit(true)强制自动提交模式,会发生什么情况?@NicolasFilotto在这种情况下,我可以关闭连接而不出现任何错误。因此我怀疑在derby的全局配置中,这不再是默认启用的自动提交模式。获取连接后getAutoCommit()返回什么?或者,如果方法getConnection()未处于自动提交模式,则根据所选的隔离级别,与查询匹配的记录可能处于锁定状态,直到您提交事务以释放锁定为止。如果您确实处于自动提交模式,则无需提交任何内容,这就是为什么我想知道getAutoCommit()的值
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 = ?