由于应用程序的数据一致性问题(零星数据丢失),我必须深入研究事务处理。我创建了一个扩展事件会话:
CREATE EVENT SESSION [system_rollback_error] ON SERVER
ADD EVENT sqlserver.error_reported(
ACTION(
package0.event_sequence,
sqlserver.client_app_name,
sqlserver.client_hostname,
sqlserver.database_id,
sqlserver.database_name,
sqlserver.server_principal_name,
sqlserver.session_id,
sqlserver.session_nt_username,
sqlserver.sql_text,
sqlserver.transaction_id,
sqlserver.transaction_sequence
)
WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4))
AND [severity]>(10))),
ADD EVENT sqlserver.sql_transaction(
ACTION(
package0.event_sequence,
sqlserver.client_app_name,
sqlserver.client_hostname,
sqlserver.database_id,
sqlserver.database_name,
sqlserver.server_principal_name,
sqlserver.session_id,
sqlserver.session_nt_username,
sqlserver.sql_text,
sqlserver.transaction_id,
sqlserver.transaction_sequence
)
WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4))
AND [transaction_state]='Rollback'
AND [transaction_type]='System'))
ADD TARGET package0.event_file(
SET filename=N'system_rollback_error',
max_file_size=(100)
)
WITH (
MAX_MEMORY=4096 KB,
EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,
MAX_DISPATCH_LATENCY=30 SECONDS,
MAX_EVENT_SIZE=0 KB,
MEMORY_PARTITION_MODE=NONE,
TRACK_CAUSALITY=OFF,
STARTUP_STATE=OFF
)
GO
Run Code Online (Sandbox Code Playgroud)
现在,我收到此 ext-event 会话中显示的大量 DUI 语句,所有这些语句都处于自动提交模式,但没有任何错误消息。没有关键违规,没有错误的语法或让我知道为什么事务被回滚的东西。我已经使用检查了事务日志
select * from sys.fn_dblog(NULL,NULL) where operation in ('LOP_ABORT_XACT')
Run Code Online (Sandbox Code Playgroud)
但也什么也没有。
您是否知道为什么自动提交事务的 transaction_state“回滚”没有错误?(这不是语句末尾的回滚,也不是隐式事务模式下的中断会话,因为这是事务类型“用户”而不是“系统”)。
您是否知道为什么自动提交事务的 transaction_state“回滚”没有错误?
客户端可以通过发送“注意”来中止正在运行的批处理。这是取消 SSMS 中正在运行的查询的方式,也是超时的工作方式。
您可以将sqlserver.attention
事件添加到您的跟踪中,例如
CREATE EVENT SESSION [attentions] ON SERVER
ADD EVENT sqlserver.attention(
ACTION(sqlserver.sql_text))
Run Code Online (Sandbox Code Playgroud)