jdbc規範中定義了四個資料庫事務級別:
transaction_none 【無事務】
transaction_read_uncommitted 【讀取未提交】
transaction_read_committed 【讀取已提交】
transaction_repeatable_read 【可重複讀】
transaction_serializable 【序列化】
如上的中文命名是我自己取的,是字面翻譯。
各級別的事務影響到的效果分別有幾個:
幻讀 ,不可重複讀, 髒讀
它們真的事務嚴格級別的排序就是:
幻讀 < 不可重複讀 < 髒讀
幻讀:表示在事務1執行中,分別根據相同條件查詢2次,兩次中間,事務2插入了一條記錄,並且提交了事務。事務1在第二次讀取時,可以看到剛才事務2插入的資料。但是事務2修改的資料是無法讀取(實際中應該是事務2並無法在事務1執行中,更新事務1鎖定的記錄。這個鎖應該是行級別的鎖,但是並沒鎖定表,所以插入資料是可以的,這是個人理解,如有大俠發現不對,請幫我更正)
不可重複讀:意思就是在乙個事務中,先後讀取2此資料,資料內容不一樣(說的是相同記錄中字段值變化了,不包含出現了新的記錄行),傳送這個的原理就是,事務1中,先讀取第一次,之後事務2更新了事務1中查詢出的某些記錄的字段值,並且是事務2提交了事務。然後事務1又重新讀取剛才相同查詢條件的記錄,發現和之前查詢中相同記錄中字段值有些已經不一樣了。
髒讀:表示事務1修改了資料(修改字段或者插入記錄),還沒提交事務時,事務2就執行了,而且可以看到並使用事務1做了修改的記錄,而此時事務1還並沒有提交呢。表示事務2發生了髒讀,事務2使用了還沒提交的資料,這些資料就叫髒資料。所以叫髒讀。這是危險的,因為事務1可能之後選擇回滾事務。那麼再某些業務上將產生嚴重的錯誤。
jdbc事務級別從不嚴格到嚴格,產生的不良效果從重到輕,效率也從快到慢:
transaction_none 【無事務】
什麼不良效果都可能發生
transaction_read_uncommitted 【讀取未提交】
可產生:髒讀、不可重複讀、幻讀
字面意思理解:我可以讀取別人未提交的內容。
transaction_read_committed 【讀取已提交】
可產生:不可重複讀、幻讀
字面理解:在我的事務過程中,可以讀取別人已經提交的資料
transaction_repeatable_read 【可重複讀】
可產生:幻讀
字面理解:可以重複讀,意思是,杜絕了不可重複讀(含)以上,但會產生幻讀。
transaction_serializable 【序列化】
以上不良效果都不會產生,因為事務是序列化的,就是乙個乙個的事務挨個執行。應該是鎖定了整個表。
資料庫事務
事件是訪問並可能更新各種資料項的乙個程式執行單元。事件由事務開始與事務結束之間執行的全體操作組成。為了保證資料完整性,資料庫系統需要維護事務的以下性質 原子性 atomicity 事務中的操作要麼全部成功,要麼全部失敗。一致性 consistency 事務執行前後要保持資料庫的一致性。隔離性 iso...
資料庫 事務
資料庫事務 database transaction 是指作為單個邏輯工作單元執行的一系列操作。事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為乙個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程式更加可靠。乙個邏輯工作單元要成...
資料庫事務
這段時間面試,由於基礎不是特別好,遇到一些要筆試的公司。就會表示出來 今天有人問我,資料庫事務 是什麼。我只感覺十分熟悉。但是又說不出所以然。回來找了一下,現在整理記錄 1 定義 資料庫事務 database transaction 是指作為單個邏輯工作單元執行的一系列操作。事務處理可以確保除非事務...