Sql server 有没有办法确定JDBC事务是否有效?
我正在通过JDBC调用几个SQLServer2008存储过程 我希望所有这些proc调用都是同一事务的一部分 在java方面,我有以下等价物:Sql server 有没有办法确定JDBC事务是否有效?,sql-server,jdbc,Sql Server,Jdbc,我正在通过JDBC调用几个SQLServer2008存储过程 我希望所有这些proc调用都是同一事务的一部分 在java方面,我有以下等价物: con.setAutoCommit( false ); boolean hasFailed = true; try { ... call PROC_1 ... call PROC_2 con.commit( ); hasFailed = false; } finally { if ( hasFailed ) { co
con.setAutoCommit( false );
boolean hasFailed = true;
try
{
... call PROC_1
... call PROC_2
con.commit( );
hasFailed = false;
}
finally
{
if ( hasFailed )
{
con.rollback( );
}
con.setAutoCommit( true );
}
在PROC_1中,我有一个事务保护,只有在没有有效事务的情况下才启动新事务
通过检查@TRANCOUNT的值来实现保护
declare @owns_transaction int = 0
begin try
if @@TRANCOUNT = 0
begin
begin transaction
set @owns_transaction = 1
end
... do work
if @owns_transaction = 1
begin
commit transaction
set @owns_transaction = 0
end
end try
begin catch
if @owns_transaction = 1
begin
rollback transaction
set @owns_transaction = 0
end
... handle error
end catch
但是,当我进入PROC_1时,@@TRANCOUNT仍然是0,因此它会启动一个新的事务,我认为这可能会在以后产生一些可怕的后果
我尝试使用XACT_STATE(),但它也返回一个结果0,这意味着“当前请求没有活动的用户事务”。根据这一点,我还必须启动一个手动事务
我做错什么了吗
顺便说一句,我认为SQLServer确实知道它在事务中,因为如果我在transaction
语句中添加一个名称,它会阻止rollback
使用该名称回滚事务。这给了我一个线索,顶层事务不是在PROC_1中启动的,而是在JDBC中启动的。找到了一种方法
当你打电话的时候
con.setAutoCommit(false)
相当于在连接上设置IMPLICIT_TRANSACTIONS选项,如下所示
SET IMPLICIT_TRANSACTIONS ON;
然后,您可以使用@@OPTIONS函数检查隐式事务状态:
if ((@@OPTIONS & 2) != 2) and (@@TRANCOUNT = 0)
begin
select 'No transaction'
end
else begin
select 'Already in transaction'
end