我有一种方法可以创建与嵌入式 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 :
关于java - 当事务仍处于 Activity 状态时无法关闭连接 connection.close() 上出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36666686/