㈠ 如何理解資料庫事務一致性
定義:資料庫一致性(database
consistency)是指事務執行的結果必須是使資料庫從一個一致性狀態變到另一個一致性狀態。
資料庫狀態如何變化?每一次數據變更就會導致資料庫的狀態遷移。如果資料庫的初始狀態是c0,第一次事務t1的提交就會導致系統生成一個system
change
number(scn),這是資料庫狀態從c0轉變成c1。執行第二個事務t2的時候資料庫狀態從t1變成t2,以此類推,執行第tn次事務的時候資料庫狀態由c(n-1)變成cn。
定義一致性主要有2個方面,一致讀和一致寫。
一致寫:事務執行的數據變更只能基於上一個一致的狀態,且只能體現在一個狀態中。t(n)的變更結果只能基於c(n-1),c(n-2),
...c(1)狀態,且只能體現在c(n)狀態中。也就是說,一個狀態只能有一個事務變更數據,不允許有2個或者2個以上事務在一個狀態中變更數據。至於具體一致寫基於哪個狀態,需要判斷t(n)事務是否和t(n-1),t(n-2),...t(1)有依賴關系。
一致讀:事務讀取數據只能從一個狀態中讀取,不能從2個或者2個以上狀態讀取。也就是t(n)只能從c(n-1),c(n-2)...
c(1)中的一個狀態讀取數據,不能一部分數據讀取自c(n-1),而另一部分數據讀取自c(n-2)。
擺事實
一致寫:
定義100個事務t(1)...t(100)實現相同的邏輯
update
table
set
i=i+1,i的初始值是0,那麼並發執行這100個事務之後i的值是多少?可能很容易想到是100。那麼怎麼從一致性角度去理解呢?
資料庫隨機調度到t(50)執行,此時資料庫狀態是c(0),而其它事務都和t(50)有依賴關系,根據寫一致性原理,其它事務必須等到t(50)執行完畢後資料庫狀態變為c(1)才可以執行。因此資料庫利用鎖機制阻塞其它事務的執行。直到t(50)執行完畢,資料庫狀態從c(0)遷移到c(1)。資料庫喚醒其它事務後隨機調度到t(89)執行,以此類推直到所有事務調度執行完畢,資料庫狀態最終變為c(100)。
一致讀:
還是上面的例子,假設t(1)...t(100)順序執行,在不同的時機執行select
i
from
table,我們看到i的值是什麼?
1.
t(1)的執行過程中。資料庫狀態尚未遷移,讀到的i=0
2.
t(1)執行完畢,t(2)的執行過程中,資料庫狀態遷移至c(1),讀到的i=1
㈡ 關系資料庫事務的特性是什麼
關系資料庫事務(DatabaseTransaction)是指一個可以包含多個步驟來完成所需要的任務的工作單元。通過事務將一系列不可分割的資料庫操作作為一個整體來執行,從而保證了資料庫的完整性和有效性。其包含了一組資料庫操作命令的一個操作序列,事務中所有命令作為一個整體向系統提交或撤銷操作請求(要麼完全執行,要麼完全不執行,即資料庫命令系列要麼都成功,要麼都不成功)。
2.1.1事務特性資料庫事務必須具備ACID特性,一個邏輯工作單元要成為事務,必須滿足ACID屬性。
ACID是指Atomicity(原子性)、Consistency(一致性)、Isolation(隔離性)和Durability(持久性)。事務由資料庫管理系統(DBMS)中的事務管理子系統負責處理。
1.原子性原子性指的是一個事務(Transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
2.一致性一致性指的是在一個事務執行之前和執行之後資料庫都必須處於一致性狀態。如果事務成功完成,那麼系統中所有變化將正確地應用,系統處於有效狀態。如果在事務中出現錯誤,那麼系統中的所有變化將自動地回滾,系統返回到原始狀態。
3.隔離性隔離性指的是在並發環境中,當不同的事務同時操縱相同的數據時,每個事務都有各自的完整數據空間。由並發事務所做的修改必須與任何其他並發事務所做的修改隔離。事務查看數據更新時,數據所處的狀態要麼是另一事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會查看到中間狀態的數據。
4.持久性持久性指的是只要事務成功結束,它對資料庫所做的更新就必須永久地保存下來。即使發生系統崩潰,重新啟動資料庫系統後,資料庫還能恢復到事務成功結束時的狀態。
㈢ 資料庫事務原子性,一致性是怎樣實現的
原子性:一個事務內的所有sql操作是一個整體。都執行成功才算整個事務成功。如果某個失敗,則必須要會退到事務執行之前的狀態,執行成功的SQL需要被撤銷。
innodb通過undo log和redo log來實現。
事務中,每當執行一條SQL語句對數據產生了影響,就會記錄下來與之相反的操作到undo log(撤銷日誌)中,例如,更新會記錄之前的狀態,刪除會形成insert,添加會形成delete,一旦事務被回滾,則執行undo log中記錄的操作,來完成恢復到之前的狀態。這里是個 邏輯恢復哦!同時,每當執行一條事務中的SQL,會將操作記錄到redo log中,此時事務一旦被提交,就將該redolog中的操作,持久化到磁碟上,數據就持久的記錄下來了(ACID的D)。
PS:還有,undolog才是原子性的關鍵。提供redolog,應該主要目的是提升磁碟的IO開銷吧,如果直接寫入磁碟,IO開銷,會很大。如果先將操作記錄到redolog中,可以順序的記錄,批量的記錄,再一起同步到磁碟上,速度會比直接寫磁碟快些。 mysql在生成redolog時,會使用 innodb log buffer,先緩沖到內存中,再同步到redolog上,速度會更快。
另外關於,一致性,應該是個整體概念,保證所有的mysql對象(數據,索引,約束,日誌,用戶)在事務執行前後都具有完整的特性,應該是mysql所有的功能都為此服務吧!
㈣ 資料庫安全事務 可以在客戶端執行嗎
資料庫事務(Database Transaction) ,是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向數據的資源。通過將一組相關操作組合為一個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程序更加可靠。一個邏輯工作單元要成為事務,必須滿足所謂的ACID(原子性、一致性、隔離性和持久性)屬性。事務是資料庫運行中的一個邏輯工作單位,由DBMS中的事務管理子系統負責事務的處理。
㈤ 「資料庫中的事務」是什麼
資料庫事務(Database Transaction) ,事務是一系列作為一個邏輯單元來執行的操作集合。它是資料庫維護數據一致性的單位,它將資料庫從一致狀態轉變為新的一致狀態,指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向數據的資源。事務是資料庫運行中的邏輯工作單位,由DBMS中的事務管理子系統負責事務的處理。
㈥ 資料庫事務四大特性是什麼
1、原子性(Atomicity)
原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能對資料庫有任何影響。
2、 一致性(Consistency)
一致性是指事務必須使資料庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之後都必須處於一致性狀態。
拿轉賬來說,假設用戶A和用戶B兩者的錢加起來一共是5000,那麼不管A和B之間如何轉賬,轉幾次賬,事務結束後兩個用戶的錢相加起來應該還得是5000,這就是事務的一致性。
3、隔離性(Isolation)
隔離性是當多個用戶並發訪問資料庫時,比如操作同一張表時,資料庫為每一個用戶開啟的事務,不能被其他事務的操作所干擾,多個並發事務之間要相互隔離。
即要達到這么一種效果:對於任意兩個並發的事務T1和T2,在事務T1看來,T2要麼在T1開始之前就已經結束,要麼在T1結束之後才開始,這樣每個事務都感覺不到有其他事務在並發地執行。
4、持久性(Durability)
持久性是指一個事務一旦被提交了,那麼對資料庫中的數據的改變就是永久性的,即便是在資料庫系統遇到故障的情況下也不會丟失提交事務的操作。
(6)資料庫事務安全性擴展閱讀
在資料庫中,關於讀數據的概念:
1、臟讀(Dirty Reads):所謂臟讀就是對臟數據(Drity Data)的讀取,而臟數據所指的就是未提交的數據。也就是說,一個事務正在對一條記錄做修改,在這個事務完成並提交之前,這條數據是處於待定狀態的(可能提交也可能回滾)。
這時,第二個事務來讀取這條沒有提交的數據,並據此做進一步的處理,就會產生未提交的數據依賴關系。這種現象被稱為臟讀。
2、不可重復讀(Non-Repeatable Reads):一個事務先後讀取同一條記錄,但兩次讀取的數據不同,我們稱之為不可重復讀。也就是說,這個事務在兩次讀取之間該數據被其它事務所修改。
3、幻讀(Phantom Reads):一個事務按相同的查詢條件重新讀取以前檢索過的數據,卻發現其他事務插入了滿足其查詢條件的新數據,這種現象就稱為幻讀。
㈦ 為了保障數據的完整性、安全性和一致性,需要把對資料庫的操作劃分為「事務」的基本單位,一個事物要麼全
這句話是對的。
你可以這么理解事務,即一個一連串動作。如果一個動作做完整了(all)就結束這個操作。如果做了一半出錯了或者其他原因沒有做完,就回滾了(nothing),什麼也不做,到原始狀態了。就像樓上所說的取錢沒有完成,卡機了,就回滾回去了。這樣就保證了你的卡上的金額是完整的、安全的、一致的。
㈧ 資料庫事務隔離級別 一般用哪個
術式之後皆為邏輯,一切皆為需求和實現。希望此文能從需求、現狀和解決方式的角度幫大家理解隔離級別。
隔離級別的產生
在串型執行的條件下,數據修改的順序是固定的、可預期的結果,但是並發執行的情況下,數據的修改是不可預期的,也不固定,為了實現數據修改在並發執行的情況下得到一個固定、可預期的結果,由此產生了隔離級別。
所以隔離級別的作用是用來平衡資料庫並發訪問與數據一致性的方法。
事務的4種隔離級別
READ UNCOMMITTED 未提交讀,可以讀取未提交的數據。READ COMMITTED 已提交讀,對於鎖定讀(select with for update 或者 for share)、update 和 delete 語句, InnoDB 僅鎖定索引記錄,而不鎖定它們之間的間隙,因此允許在鎖定的記錄旁邊自由插入新記錄。 Gap locking 僅用於外鍵約束檢查和重復鍵檢查。REPEATABLE READ 可重復讀,事務中的一致性讀取讀取的是事務第一次讀取所建立的快照。SERIALIZABLE 序列化
在了解了 4 種隔離級別的需求後,在採用鎖控制隔離級別的基礎上,我們需要了解加鎖的對象(數據本身&間隙),以及了解整個數據范圍的全集組成。
數據范圍全集組成
SQL 語句根據條件判斷不需要掃描的數據范圍(不加鎖);
SQL 語句根據條件掃描到的可能需要加鎖的數據范圍;
以單個數據范圍為例,數據范圍全集包含:(數據范圍不一定是連續的值,也可能是間隔的值組成)
1. 數據已經填充了整個數據范圍:(被完全填充的數據范圍,不存在數據間隙)
整形,對值具有唯一約束條件的數據范圍 1~5 ,
已有數據1、2、3、4、5,此時數據范圍已被完全填充;
整形,對值具有唯一約束條件的數據范圍 1 和 5 ,
已有數據1、5,此時數據范圍已被完全填充;
整形的數據范圍 1~5 ,
已有數據 1、2、3、4、5,但是因為沒有唯一約束,
所以數據范圍可以繼續被 1~5 的數據重復填充;
整形,具有唯一約束條件的數據范圍 1~5 ,
已有數據 2,5,此時數據范圍未被完全填充,還可以填充 1、3、4 ;
整形的數據范圍 1~5 ,數據范圍內當前沒有任何數據。
更新丟失:當多個事務選擇了同一行,然後基於最初選定的值更新該行時,
由於每個事物不知道其他事務的存在,最後的更新就會覆蓋其他事務所做的更新;
臟讀: 一個事務正在對一條記錄做修改,這個事務完成並提交前,這條記錄就處於不一致狀態。
這時,另外一個事務也來讀取同一條記錄,如果不加控制,
第二個事務讀取了這些「臟」數據,並據此做了進一步的處理,就會產生提交的數據依賴關系。
這種現象就叫「臟讀」。
不可重復讀:一個事務在讀取某些數據後的某個時間,再次讀取以前讀過的數據,
卻發現其讀出的數據已經發生了改變,或者某些記錄已經被刪除了。
這種現象就叫「不可重復讀」。
幻讀:一個事務按相同的查詢條件重新讀取以前檢索過的數據,
卻發現其他事務插入了滿足其查詢條件的新數據,這種現象稱為「幻讀」。
可以簡單的認為滿足條件的數據量變化了。
Record Locks
索引記錄鎖,索引記錄鎖始終鎖定索引記錄,即使表中未定義索引,
這種情況下,InnoDB 創建一個隱藏的聚簇索引,並使用該索引進行記錄鎖定。
Gap Locks
間隙鎖是索引記錄之間的間隙上的鎖,或者對第一條記錄之前或者最後一條記錄之後的鎖。
間隙鎖是性能和並發之間權衡的一部分。
對於無間隙的數據范圍不需要間隙鎖,因為沒有間隙。
Next-Key Locks
索引記錄上的記錄鎖和索引記錄之前的 gap lock 的組合。
假設索引包含 10、11、13 和 20。
可能的next-key locks包括以下間隔,其中圓括弧表示不包含間隔端點,方括弧表示包含端點:
(負無窮大, 10] (10, 11] (11, 13] (13, 20] (20, 正無窮大) 對於最後一個間隔,next-key將會鎖定索引中最大值的上方,
2. 數據填充了部分數據范圍:(未被完全填充的數據范圍,是存在數據間隙)
3. 數據范圍內沒有任何數據(存在間隙)
如下:
在了解了數據全集的組成後,我們再來看看事務並發時,會帶來的問題。
無控制的並發所帶來的問題
並發事務如果不加以控制的話會帶來一些問題,主要包括以下幾種情況。
1. 范圍內已有數據更改導致的:
2. 范圍內數據量發生了變化導致:
因為無控制的並發會帶來一系列的問題,這些問題會導致無法滿足我們所需要的結果。因此我們需要控制並發,以實現我們所期望的結果(隔離級別)。
MySQL 隔離級別的實現
InnoDB 通過加鎖的策略來支持這些隔離級別。
行鎖包含:
左右滑動進行查看
"上確界"偽記錄的值高於索引中任何實際值。
上確界不是一個真正的索引記錄,因此,實際上,這個 next-key 只鎖定最大索引值之後的間隙。
基於此,當獲取的數據范圍中,數據已填充了所有的數據范圍,那麼此時是不存在間隙的,也就不需要 gap lock。
對於數據范圍內存在間隙的,需要根據隔離級別確認是否對間隙加鎖。
默認的 REPEATABLE READ 隔離級別,為了保證可重復讀,除了對數據本身加鎖以外,還需要對數據間隙加鎖。
READ COMMITTED 已提交讀,不匹配行的記錄鎖在 MySQL 評估了 where 條件後釋放。
對於 update 語句,InnoDB 執行 "semi-consistent" 讀取,這樣它會將最新提交的版本返回到 MySQL,
以便 MySQL 可以確定該行是否與 update 的 where 條件相匹配。
總結&延展:
唯一索引存在唯一約束,所以變更後的數據若違反了唯一約束的原則,則會失敗。
當 where 條件使用二級索引篩選數據時,會對二級索引命中的條目和對應的聚簇索引都加鎖;所以其他事務變更命中加鎖的聚簇索引時,都會等待鎖。
行鎖的增加是一行一行增加的,所以可能導致並發情況下死鎖的發生。
例如,
在 session A 對符合條件的某聚簇索引加鎖時,可能 session B 已持有該聚簇索引的 Record Locks,而 session B 正在等待 session A 已持有的某聚簇索引的 Record Locks。
session A 和 session B 是通過兩個不相乾的二級索引定位到的聚簇索引。
session A 通過索引 idA,session B通過索引 idB 。
當 where 條件獲取的數據無間隙時,無論隔離級別為 rc 或 rr,都不會存在間隙鎖。
比如通過唯一索引獲取到了已完全填充的數據范圍,此時不需要間隙鎖。
間隙鎖的目的在於阻止數據插入間隙,所以無論是通過 insert 或 update 變更導致的間隙內數據的存在,都會被阻止。
rc 隔離級別模式下,查詢和索引掃描將禁用 gap locking,此時 gap locking 僅用於外鍵約束檢查和重復鍵檢查(主要是唯一性檢查)。
rr 模式下,為了防止幻讀,會加上 Gap Locks。
事務中,SQL 開始則加鎖,事務結束才釋放鎖。
就鎖類型而言,應該有優化鎖,鎖升級等,例如rr模式未使用索引查詢的情況下,是否可以直接升級為表鎖。
就鎖的應用場景而言,在回放場景中,如果確定事務可並發,則可以考慮不加鎖,加快回放速度。
鎖只是並發控制的一種粒度,只是一個很小的部分:
從不同場景下是否需要控制並發,(已知無交集且有序的數據的變更,MySQL 的 MTS 相同前置事務的多事務並發回放)
並發控制的粒度,(鎖是一種邏輯粒度,可能還存在物理層和其他邏輯粒度或方式)
相同粒度下的優化,(鎖本身存在優化,如IX、IS類型的優化鎖)
粒度載入的安全&性能(如獲取行鎖前,先獲取頁鎖,頁鎖在執行獲取行鎖操作後即釋放,無論是否獲取成功)等多個層次去思考並發這玩意。
㈨ 請簡單介紹一下資料庫事務的4大特性
事務的:原子性、一致性、分離性、持久性
原子性、一致性、分離性、持久性
(1) 原子性
事務的原子性指的是,事務中包含的程序作為資料庫的邏輯工作單位,它所做的對數據修改操作要麼全部執行,要麼完全不執行。這種特性稱為原子性。
事務的原子性要求,如果把一個事務可看作是一個程序,它要麼完整的被執行,要麼完全不執行。就是說事務的操縱序列或者完全應用到資料庫或者完全不影響資料庫。這種特性稱為原子性。
假如用戶在一個事務內完成了對資料庫的更新,這時所有的更新對外部世界必須是可見的,或者完全沒有更新。前者稱事務已提交,後者稱事務撤消(或流產)。DBMS必須確保由成功提交的事務完成的所有操縱在資料庫內有完全的反映,而失敗的事務對資料庫完全沒有影響。
(2) 一致性
事務的一致性指的是在一個事務執行之前和執行之後資料庫都必須處於一致性狀態。這種特性稱為事務的一致性。假如資料庫的狀態滿足所有的完整性約束,就說該資料庫是一致的。
一致性處理資料庫中對所有語義約束的保護。假如資料庫的狀態滿足所有的完整性約束,就說該資料庫是一致的。例如,當資料庫處於一致性狀態S1時,對資料庫執行一個事務,在事務執行期間假定資料庫的狀態是不一致的,當事務執行結束時,資料庫處在一致性狀態S2。
(3) 分離性
分離性指並發的事務是相互隔離的。即一個事務內部的操作及正在操作的數據必須封鎖起來,不被其它企圖進行修改的事務看到。
分離性是DBMS針對並發事務間的沖突提供的安全保證。DBMS可以通過加鎖在並發執行的事務間提供不同級別的分離。假如並發交叉執行的事務沒有任何控制,操縱相同的共享對象的多個並發事務的執行可能引起異常情況。
DBMS可以在並發執行的事務間提供不同級別的分離。分離的級別和並發事務的吞吐量之間存在反比關系。較多事務的可分離性可能會帶來較高的沖突和較多的事務流產。流產的事務要消耗資源,這些資源必須要重新被訪問。因此,確保高分離級別的DBMS需要更多的開銷。
(4)持久性
持久性意味著當系統或介質發生故障時,確保已提交事務的更新不能丟失。即一旦一個事務提交,DBMS保證它對資料庫中數據的改變應該是永久性的,耐得住任何系統故障。持久性通過資料庫備份和恢復來保證。
持久性意味著當系統或介質發生故障時,確保已提交事務的更新不能丟失。即對已提交事務的更新能恢復。一旦一個事務被提交,DBMS必須保證提供適當的冗餘,使其耐得住系統的故障。所以,持久性主要在於DBMS的恢復性能。
㈩ 事務從哪些方面保障資料庫的安全
要回答這個問題就必須涉及到一個資料庫名詞(也可以說是四個):ACID。
Atomicity:原子性
Consistency:一致性
Isolation:隔離性
Durability:持久性
事務的目的也就是維持資料庫的這四大特性。
首先,要保證實務操作的原子性,即被定義為原子的一串事務操作必須玩政治性,否則這串操作就要全部回溯(取消)。這點保證了數據的正確性,不會出現數據寫了一半掛掉了,這寫了一半的數據還存在的情況(想想這對安全是多麼大的保障)。
其次一致性,相當於做了個快照,比如你正在讀,還沒讀完,別人更改了這個數據,那麼你讀出來的應該是更改之前的,也就是你讀這個操作的時間點上的數據快照(這里的讀是個原子操作)。
然後是隔離性,這個也是很重要的,舉個栗子,你有1W存款,你用你的銀行卡在提款機提1W,同時你老婆用你的銀行卡的副卡在銀行里提1W,如果你倆提錢的時間幾乎同時,那資料庫如何保證不同時給你們倆吐出1W(共兩W)呢,這就靠一致性來解決,在其中一個人提錢時會鎖住賬戶(就算是同時也會競爭出一個鎖),這樣就能保證數據一致行了。大部分人講這個例子都是以插入舉例,我覺得我這個例子挺好的。
最後,持久性,這個不要說了吧,必須要保證數據能夠保存在硬碟上。
事務就是要保證以上這四點,保證了這四點,資料庫里的數據就正確了。