HiveBrain v1.2.0
Get Started
← Back to all entries
patternsqlMinor

catch and understand transaction rollback

Submitted by: @import:stackexchange-dba··
0
Viewed 0 times
rollbackcatchunderstandtransactionand

Problem

Because of the data consistency issue of the application (sporadic data loss) I have to perform a deep dive into transaction handling.
I've created an extended event session:

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


Now I get a lot of DUI statements shown in this ext-event session, all of them are in autocommit mode but there is no one error message. No key violation, no wrong syntax or something giving me an idea why transaction was rolled back. I've checked transac

Solution

Do you have an idea, why an autocommit transaction has a transaction_state "Rollback" with no errors?

The client can abort a running batch by sending an "attention". This is how you cancel a running query in SSMS, and this is how timeouts work.

You can add the sqlserver.attention event to your trace, eg

CREATE EVENT SESSION [attentions] ON SERVER 
ADD EVENT sqlserver.attention(
    ACTION(sqlserver.sql_text))

Code Snippets

CREATE EVENT SESSION [attentions] ON SERVER 
ADD EVENT sqlserver.attention(
    ACTION(sqlserver.sql_text))

Context

StackExchange Database Administrators Q#307687, answer score: 6

Revisions (0)

No revisions yet.