我们有一个随机会话的问题,使他们的事务打开未提交的更改,并最终阻止其他用户。是否可以查询服务器元数据来检查某个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
上工作,据说没有被记录。