Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查SQL Server 2005中是否存在尚未提交的事务?_Sql_Sql Server_Sql Server 2005_Transactions - Fatal编程技术网

如何检查SQL Server 2005中是否存在尚未提交的事务?

如何检查SQL Server 2005中是否存在尚未提交的事务?,sql,sql-server,sql-server-2005,transactions,Sql,Sql Server,Sql Server 2005,Transactions,是否有人知道用于检查SQL Server 2005中是否存在未提交事务的命令?在SQL 2005、2008中使用或使用DMV运行 DBCC OPENTRAN XACT_STATE()报告会话的事务状态,指示会话是否有活动事务,以及事务是否能够提交。它返回三个值: 1,会话具有活动事务。会话可以执行任何操作,包括写入数据和提交事务 0,则该会话没有活动的事务 -1,会话有一个活动事务,但发生了一个错误,导致该事务被分类为不可提交事务。会话无法提交事务或回滚到保存点;它只能请求事务的完全回滚。会

是否有人知道用于检查SQL Server 2005中是否存在未提交事务的命令?

在SQL 2005、2008中使用或使用DMV

运行

DBCC OPENTRAN
XACT_STATE()报告会话的事务状态,指示会话是否有活动事务,以及事务是否能够提交。它返回三个值:

  • 1,会话具有活动事务。会话可以执行任何操作,包括写入数据和提交事务
  • 0,则该会话没有活动的事务
  • -1,会话有一个活动事务,但发生了一个错误,导致该事务被分类为不可提交事务。会话无法提交事务或回滚到保存点;它只能请求事务的完全回滚。会话在回滚事务之前无法执行任何写入操作。在回滚事务之前,会话只能执行读取操作。事务回滚后,会话可以执行读写操作,并可以开始新的事务
@@TRANCOUNT返回当前连接的活动事务数

  • 0,不在事务中
  • 1、在交易中
  • n、 在嵌套事务中
sp\u who2 锁

--只有在执行SELECT@@TRANCOUNT命令时,才会获取数据库名称。否则为NULL


执行上面的代码。。。将给出事务发生的会话详细信息。

总之,有几种方法:

  • 选择@@trancount
  • DBCC OPENTRAN
  • 选择XACT_STATE()
  • 从sys.dm\u trans\u active\u事务中选择*

  • +1非常好地解释..如何执行事务的完全回滚,正如您所说的
    会话无法提交事务或回滚到保存点;它只能请求事务的完全回滚。
    。“完全回滚”是什么意思?@KhurramAli,“-1”表示不能使用“提交”或“回滚您的保存点”,但必须使用“回滚”,它基本上将@transcount设置为零,以回滚每个嵌套事务。
    SELECT
        trans.session_id AS [SESSION ID],
        ESes.host_name AS [HOST NAME],login_name AS [Login NAME],
        trans.transaction_id AS [TRANSACTION ID],
        tas.name AS [TRANSACTION NAME],tas.transaction_begin_time AS [TRANSACTION BEGIN TIME],
        tds.database_id AS [DATABASE ID],DBs.name AS [DATABASE NAME]
    FROM sys.dm_tran_active_transactions tas
    JOIN sys.dm_tran_session_transactions trans
    ON (trans.transaction_id=tas.transaction_id)
    LEFT OUTER JOIN sys.dm_tran_database_transactions tds
    ON (tas.transaction_id = tds.transaction_id )
    LEFT OUTER JOIN sys.databases AS DBs
    ON tds.database_id = DBs.database_id
    LEFT OUTER JOIN sys.dm_exec_sessions AS ESes
    ON trans.session_id = ESes.session_id
    WHERE ESes.session_id IS NOT NULL