我有一个方法可以创建与嵌入式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: Cannot close a connection while a transaction is still active.
但是当我关闭Connection.commit()
或设置Connection
autoCommit
之前我致电true
时(默认设置为false
我{{1}对于我的Connection
,它允许我成功关闭连接并获得所需的结果。
但我是否真的需要致电Connection
进行commit()
操作?有什么承诺?如果我不提交,那么某个地方是否存在未被释放的锁定?
这post说我不应该这样做。我应该能够关闭我的连接,而不必提交或回滚。
我错过了什么?
答案 0 :(得分:1)
如果您在autoCommit
模式下不,那么SELECT
语句实际上是持有读锁,具体取决于您的隔离级别,因此提交{{1查询不仅仅是一个无操作。
是的,数据库没有变化,但提交仍然告诉数据库引擎您的事务已完成查看数据,因此它可以允许其他事务修改数据。
以下是一些背景资料: