Sql server 有没有办法确定JDBC事务是否有效?

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

我正在通过JDBC调用几个SQLServer2008存储过程

我希望所有这些proc调用都是同一事务的一部分

在java方面,我有以下等价物:

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