XACT_ABORT और XACT_STATE

SQL Server में Transactions और Error Handling

Miriam Antona

Software Engineer

XACT_ABORT

यह बताता है कि त्रुटि होने पर वर्तमान ट्रांज़ैक्शन अपने-आप रोलबैक होगा या नहीं.

SET XACT_ABORT { ON | OFF }
SET XACT_ABORT OFF
  • डिफ़ॉल्ट सेटिंग
  • अगर त्रुटि हो: खुले ट्रांज़ैक्शन रह सकते हैं
SET XACT_ABORT ON
  • अगर त्रुटि हो: ट्रांज़ैक्शन रोलबैक होता है और निष्पादन रुकता है
SQL Server में Transactions और Error Handling

XACT_ABORT - उदाहरण

SET XACT_ABORT OFF; --Default setting

BEGIN TRAN;
    INSERT INTO customers VALUES ('Mark', 'Davis', '[email protected]', '555909090');
    INSERT INTO customers VALUES ('Dylan', 'Smith', '[email protected]', '555888999'); -- ERROR!
COMMIT TRAN;
(1 row affected)
Msg. 2627, Level 14, State 1, Line 5
Violation of UNIQUE KEY 'unique_email'...
| customer_id | first_name | last_name | email                | phone     |
|-------------|------------|-----------|----------------------|-----------|
| 14          | Mark       | Davis     | [email protected]   | 555909090 |
SQL Server में Transactions और Error Handling

XACT_ABORT - उदाहरण

SET XACT_ABORT ON;

BEGIN TRAN;
    INSERT INTO customers VALUES ('Mark', 'Davis', '[email protected]', '555909090');
    INSERT INTO customers VALUES ('Dylan', 'Smith', '[email protected]', '555888999'); -- ERROR!
COMMIT TRAN;
Msg. 2627, Level 14, State 1, Line 4
Violation of UNIQUE KEY 'unique_email'...
SELECT * FROM customers WHERE first_name = 'Mark';
| customer_id | first_name | last_name | email                | phone     |
|-------------|------------|-----------|----------------------|-----------|
SQL Server में Transactions और Error Handling

RAISERROR के साथ XACT_ABORT

SET XACT_ABORT ON;
BEGIN TRAN;
    INSERT INTO customers VALUES ('Mark', 'Davis', '[email protected]', '555909090');
    RAISERROR('Raising an error!', 16, 1);
    INSERT INTO customers VALUES ('Zack', 'Roberts', '[email protected]', '555919191');
COMMIT TRAN;
Msg. 50000, Level 16, State 1, Line 5
Raising an error!
SELECT * FROM customers WHERE first_name IN ('Mark', 'Zack');
| customer_id | first_name | last_name | email                | phone     |
|-------------|------------|-----------|----------------------|-----------|
| 14          | Mark       | Davis     | [email protected]   | 555909090 |
| 15          | Zack       | Roberts   | [email protected] | 555919191 |
SQL Server में Transactions और Error Handling

THROW के साथ XACT_ABORT

SET XACT_ABORT ON;
BEGIN TRAN;
    INSERT INTO customers VALUES ('Mark', 'Davis', '[email protected]', '555909090');
    THROW 55000, 'Raising an error!', 1;
    INSERT INTO customers VALUES ('Zack', 'Roberts', '[email protected]', '555919191');
COMMIT TRAN;
(1 rows affected)
Msg. 50000, Level 16, State 1, Line 5
Raising an error!
SELECT * FROM customers WHERE first_name IN ('Mark', 'Zack');
| customer_id | first_name | last_name | email | phone |
|-------------|------------|-----------|-------|-------|
SQL Server में Transactions और Error Handling

XACT_STATE

XACT_STATE()
  • 0 -> कोई खुला ट्रांज़ैक्शन नहीं
  • 1 -> खुला और कमिट करने योग्य ट्रांज़ैक्शन
  • -1 -> खुला पर कमिट न होने योग्य ट्रांज़ैक्शन (doomed)
    • कमिट नहीं कर सकते
    • सेवपॉइंट तक रोलबैक नहीं कर सकते
    • पूरे ट्रांज़ैक्शन का रोलबैक कर सकते हैं
    • कोई बदलाव नहीं कर सकते/डेटा पढ़ सकते हैं
SQL Server में Transactions और Error Handling

XACT_STATE - open और committable

SET XACT_ABORT OFF;
BEGIN TRY
    BEGIN TRAN;
        INSERT INTO customers VALUES ('Mark', 'Davis', '[email protected]', '555909090');
        INSERT INTO customers VALUES ('Dylan', 'Smith', '[email protected]', '555888999'); -- ERROR!
    COMMIT TRAN;
END TRY
BEGIN CATCH
    IF XACT_STATE() = -1
        ROLLBACK TRAN;
    IF XACT_STATE() = 1
        COMMIT TRAN;
    SELECT ERROR_MESSAGE() AS error_message;
END CATCH
| error_message                               |
|---------------------------------------------|
| Violation of UNIQUE KEY 'unique_email'...   |
SQL Server में Transactions और Error Handling

XACT_STATE - open और committable

| customer_id | first_name | last_name | email                | phone     |
|-------------|------------|-----------|----------------------|-----------|
| 14          | Mark       | Davis     | [email protected]   | 555909090 |
SQL Server में Transactions और Error Handling

XACT_STATE - open और uncommittable (doomed)

SET XACT_ABORT ON;
BEGIN TRY
    BEGIN TRAN;
        INSERT INTO customers VALUES ('Mark', 'Davis', '[email protected]', '555909090');
        INSERT INTO customers VALUES ('Dylan', 'Smith', '[email protected]', '555888999'); -- ERROR!
    COMMIT TRAN;
END TRY
BEGIN CATCH
    IF XACT_STATE() = -1
        ROLLBACK TRAN;
    IF XACT_STATE() = 1
        COMMIT TRAN;
    SELECT ERROR_MESSAGE() AS Error_message;
END CATCH
SQL Server में Transactions और Error Handling

XACT_STATE - open और uncommittable (doomed)

SELECT * FROM customers WHERE first_name = 'Mark';
| customer_id | first_name | last_name | email                | phone     |
|-------------|------------|-----------|----------------------|-----------|
SQL Server में Transactions और Error Handling

अभ्यास करते हैं!

SQL Server में Transactions और Error Handling

Preparing Video For Download...