為什麼事務沒有回滾!

来源:http://www.cnblogs.com/i6first/archive/2016/03/31/5342080.html
-Advertisement-
Play Games

--事務的原子性要求事務要麼全部完成,要麼全部不完成,不可能停滯在某個中間狀態。--然而,我的事務卻沒有“回滾”,為此還導致了異常數據的發生,為什麼? 這是一個發生在我工作中的真實的案例,在用戶問我的時候我當時也SB了,在我理解了這背後的原理後,我雖然接受了SQL Server在某些場景下不回滾的設 ...


--事務的原子性要求事務要麼全部完成,要麼全部不完成,不可能停滯在某個中間狀態。
--然而,我的事務卻沒有“回滾”,為此還導致了異常數據的發生,為什麼?

這是一個發生在我工作中的真實的案例,在用戶問我的時候我當時也SB了,
在我理解了這背後的原理後,我雖然接受了SQL Server在某些場景下不回滾的設計使然,但不得不吐槽,這個功能真不爽!
下麵我利用一個樣例來描述這個問題:

--創建test1表
CREATE TABLE [dbo].[test1](
    [id] [int] NOT NULL,
    [testname] [varchar](10) NULL
) ON [PRIMARY]
GO

現在執行一個事務,事務中包含兩個insert操作,其中第一個insert操作的testname欄位超過了最大長度10

--顯示執行一個事務,插入兩行數據,其中第一行的testname欄位超過了最大長度

         BEGIN TRANSACTION;
         --SELECT 1
         --FROM test;
         INSERT INTO [dbo].[test1]
                                  ([id], [testname]
                                  )
         VALUES
                (1, '123456789101'
                );
         INSERT INTO [dbo].[test1]
                                  ([id], [testname]
                                  )
         VALUES
                (888, '12345'
                );
         COMMIT TRANSACTION;

如預料的一樣,SQL Server在執行第一條語句時報錯

image

“按理”說來,這個事務執行會失敗,第二條插入語句會回滾,但實際結果卻是:

select * from [dbo].[test1]

image

在某些場景下,這會導致異常數據的發生。

 

為什麼會這樣呢??

據MSDN,預設情況,SQL Server並不會回滾事務,即使事務中的某個語句報錯,事務還是會繼續執行下去,除非非常嚴重的錯誤(serverity level is greater or equals 16)。
這是由資料庫選項XACT_ABORT決定的,預設XACT_ABORT為OFF,

When SET XACT_ABORT is OFF, in some cases only the Transact-SQL statement that raised the error is rolled back and the transaction continues processing. Depending upon the severity of the error, the entire transaction may be rolled back even when SET XACT_ABORT is OFF. OFF is the default setting.

如果想規避這個問題,微軟告訴我們需要把XACT_ABORT設置為On,這樣一個事務中任務一個語句報錯都會導致整個事務回滾。

SET XACT_ABORT ON

當然,你也可以使用try、catch人工捕獲錯誤以便進行回滾或者在程式中使用事務。

 

我在想為什麼會有這麼DT的設計呢?

我們學事務的第一堂課裡面就講了事務的原子性要求:事務要麼全部執行,要麼全部失敗,不會存在中間狀態。
但SQL Server為什麼預設不回滾呢?百思不得其解。
求助MSDN時鄒大俠給的一個解釋雖然有道理(謝謝鄒大俠),但還是覺得不夠完美,因為即使是為了能夠讓開發人員自己來控制事務的狀態,也不應該把XACT_ABORT預設設置為OFF,相反,如果設置為On倒是可以接受。

 

image

 

期待其他大神們給予指導。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 從昨天下午接到新任務,要採集一個法院網站得所有公告,大概是需要採集這個網站得所有公告列表裡得所有txt內容,txt文件裡邊是一件件赤裸裸得案件,記錄這案由,原告被告等相關屬性(不知道該叫什麼就稱之為屬性吧,汗),把這些文件放到本地某個目錄,並把一個案件作為一條數據放入資料庫中。本以為很輕鬆得用Jso ...
  • 問題場景 最近在項目中遇到了對每一個類型進行求和並且求該類型所占的比例,當時考慮求出每種類型的和,併在java中分別對每一種類型的和與總和相除求出所占比例。後來,想到這樣有點麻煩,並且項目中持久層使用的是iBatis框架,所有考慮從SQL方面進行入手來簡化這個問題。 後來SQL的解決方法就為: 看到 ...
  • 一、主鍵自增長: 1) oracle: 使用序列實現,比如創建序列,起點是1000,步進是1: create sequence myseq increment by 1 start with 1000 增加記錄: insert into student(stuId,stuName) values(m ...
  • 1.Question Description: 1.1 version: mysql-5.7.11-64 1.2 form: zip file 1.3 >mysqld --install (successfully) 1.4 you create a directory called "data" ...
  • 子查詢在一個select中出現多個嵌套查詢語句 1、在where子句中使用子查詢(一般返回"單行單列" "單行多列" "多行單列"(可以提供in、any、all )) 示例1:查找低於平均工資的雇員信息(返回單行單列) 示例2:查找出公司最早雇佣的雇員信息(返回單行單列) 示例3:與scott從事同 ...
  • 一、起因 begin或者START TRANSACTION開始一個事務 rollback事務回滾 commit 事務確認 人們對事務的解釋如下:事務由作為一個單獨單元的一個或多個SQL語句組成,如果其中一個語句不能完成,整個單元就會回滾(撤銷),所有影響到的數據將返回到事務開始以前的狀態。因而,只有 ...
  • 介紹 正則表達式用來描述或者匹配符合規則的字元串。它的用法和like比較相似,但是它又比like更強大,能夠實現一些很特殊的規則匹配;正則表達式需要使用REGEXP命令,匹配上返回"1"匹配不上返回"0",REGEXP相當於like '%%'。 命令 說明 ^ 在字元的開啟處進行匹配 $ 在字元的末 ...
  • 修改ibdata1大小的驗證 ibdata是共用表空間,在MySQL初始化的時候就生成了。 但很多童鞋會看到網上各種大神的調優建議,在MySQL已經初始化的情況下,修改配置文件中innodb_data_file_path=ibdata1:12M:autoextend。導致MySQL啟動的時候報錯。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...