检查transaction_id是否包含未提交的更改



我们有一个随机会话的问题,使他们的事务打开未提交的更改,并最终阻止其他用户。是否可以查询服务器元数据来检查某个transaction_id是否持有未提交的更改?(我们的ERP是这样写的,所以它总是有一个事务打开,但它总是应该尽快提交任何更改)。

我想在ERP上写一个模块来记录未提交的更改,当不应该存在时(关闭窗口等. ...),以尽快检测这些错误。

试着用这个作为起点:

select st.session_id,
dt.database_id,
dt.database_transaction_log_bytes_used,
dt.database_transaction_log_bytes_reserved, 
datediff(second, s.last_request_end_time, getdate())
from sys.dm_tran_session_transactions as st
join sys.dm_tran_database_transactions as dt
on dt.transaction_id = st.transaction_id
join sys.dm_exec_sessions as s
on s.session_id = st.session_id;

您可能需要设置一些阈值,以确定已使用/保留的日志量和/或会话空闲的时间。

不确定这是否回答了这个问题,但我认为这将显示一个事务是否做了任何写changes:

select top 1 1 from sys.dm_tran_database_transactions
where transaction_id = CURRENT_TRANSACTION_ID() 
and database_transaction_state = 4

https://learn.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-tran-database-transactions-transact-sql?view=sql-server-ver16

4:事务已生成日志记录。

它甚至似乎在truncate table上工作,据说没有被记录。

相关内容

  • 没有找到相关文章

最新更新