捕捉并理解事务回滚

Mai*_*n21 5 sql-server

由于应用程序的数据一致性问题(零星数据丢失),我必须深入研究事务处理。我创建了一个扩展事件会话:

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“回滚”没有错误?(这不是语句末尾的回滚,也不是隐式事务模式下的中断会话,因为这是事务类型“用户”而不是“系统”)。

Dav*_*oft 6

您是否知道为什么自动提交事务的 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)