事務未解之謎
1、什麼是事務??------先暈會吧
事務是由乙個或者一組sql組成的單獨單元。在單獨單元內,要麼全部的sql執行成功,要麼全部失敗。(只要有一條sql執行失敗,則會進行回滾。)
2、事務的特性(acid)
(1)a:automicity(原子性)
原子性指的是事務中的操作,要麼都做,要麼都不做。(操作主要指的是事務中的一系列sql操作)
(2)c:consistency(一致性)
一致性指的是語義上的一致性。而非語法上的一致性。就是使資料從乙個一致性狀態切換到另外乙個一致性狀態。----其實我覺得重點在於業務邏輯。
舉例說明:轉賬(如a轉賬給b 100元)
在業務場景應該是:a= a-100 b=b-100
如果只保持原子性的話 在它的事務當中寫上 :a=a-100 || a=a-100 ,b=b-100 || b=b-100 都是沒錯的
但如果要保持一致性的話 則應寫上 a=a-100 ,b=b-100 ,這樣才滿足語義上的一致性。表達的就是a扣錢了,則b也必須要加錢。
(3)i:isolation(隔離性)
隔離性指的是併發事務之間互不干擾,互不影響。
(4)d:duration(永續性)
永續性指的是事務成功提交後,對資料庫的改變的永久的。
3、併發事務帶來的問題:
(1)髒讀 (讀到未提交的資料)
所謂髒讀,就是在乙個事務中讀到了另外乙個未提交事務的資料。
(2)不可重複讀(讀到已提交的資料,主要針對update操作)
所謂不可重複讀,是指在一次事務中,針對同一條資料查詢到了兩次不一樣的結果。
(3)幻讀(讀到已提交的資料,主要針對insert,delete操作)
所謂幻讀就是在一次事務中,針對某部分資料查詢到了兩次不一樣的結果。
(4)更新丟失
所謂更新丟失就是前一次事務提交的結果被後一次事務提交的結果給覆蓋了。
4、事務的隔離級別:
(1)讀未提交(read_uncommitted) ------隔離級別最低
可以讀取到未提交事務的資料
問題:可能出現髒讀 。。。。。
(2)讀已提交(read_committed)
只能讀取已提交事務的資料。
問題:可解決髒讀,但是不能解決不可重複讀和幻讀。
(3)可重複讀(repeatable_read)
多次讀取同一條資料時,資料的值和事務最開始的值是一樣的。
問題:可解決髒讀,不可重複讀,但不能解決幻讀。
(4)序列化(serializable)
所有事務按順序執行,只能乙個乙個處理。
問題:可以解決髒讀,幻讀,不可重複讀,但是效率低。
5、常見資料庫的隔離級別
(1)mysql
repeatable_read 可重複讀
(2) oracle
read_committed 讀已提交
(3)sql server
read_committed 讀已提交
資料庫事務
事件是訪問並可能更新各種資料項的乙個程式執行單元。事件由事務開始與事務結束之間執行的全體操作組成。為了保證資料完整性,資料庫系統需要維護事務的以下性質 原子性 atomicity 事務中的操作要麼全部成功,要麼全部失敗。一致性 consistency 事務執行前後要保持資料庫的一致性。隔離性 iso...
資料庫 事務
資料庫事務 database transaction 是指作為單個邏輯工作單元執行的一系列操作。事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為乙個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程式更加可靠。乙個邏輯工作單元要成...
資料庫事務
這段時間面試,由於基礎不是特別好,遇到一些要筆試的公司。就會表示出來 今天有人問我,資料庫事務 是什麼。我只感覺十分熟悉。但是又說不出所以然。回來找了一下,現在整理記錄 1 定義 資料庫事務 database transaction 是指作為單個邏輯工作單元執行的一系列操作。事務處理可以確保除非事務...