資料丟失問題的解決
1、a:原子性(atomicity):
事務的最小工作單元,要麼全部成功,要麼全部失敗。
2、c:一致性(consistency):
事務開始和結束時,資料庫的完整性不會被破壞。
3、i:隔離性(isolation):
不同事務之間互不影響,四種隔離級別為ru(讀未提交)、rc(讀已提交)、rr(可重複讀)、serializable(序列化)。
4、d:永續性(durability):
事務提交之後,對資料的修改是永久性的,即使系統故障也不會丟失。
又稱為髒讀,乙個事務可以讀到另乙個事務未提交的資料。這種隔離級別是最不安全的一種,因為未提交的事務存在回滾的情況。
又稱為不可重複讀,乙個事務在不同時間讀取到了另乙個事務已經提交的修改資料,導致在不同時間讀到的同一條資料的結果不一樣。
發生時間
sessiona
sessionb
1begin
2select * from user where id=1;(張三)
3update user set name=『李四』 where id=1;(預設隱式提交事務)
4select * from user where id=1;(李四)
5update user set name=『王二』 where id=1;(預設隱式提交事務)
6select * from user where id=1;(王二)
又稱為幻讀,乙個事務讀可以讀取到其他事務提交的資料,但是在rr隔離級別下,當前讀取此條資料只可讀取一次,在當前事務中,不論讀取多少次,資料任然是第一次讀取的值,不會因為在第一次讀取之後,其他事務再修改提交此資料而產生改變。因此也成為幻讀,因為讀出來的資料並不一定就是最新的資料。
發生時間
sessiona
sessionb
1begin
2select * from user where id=1;(張三)
3update user set name=『李四』 where id=1;(預設隱式提交事務)
4select * from user where id=1;(張三)
5update user set name=『王二』 where id=1;(預設隱式提交事務)
6select * from user where id=1;(張三)
所有的資料庫的讀或者寫操作都為序列執行,當前隔離級別下只支援單個請求同時執行,所有的操作都需要佇列執行。這種隔離級別下所有的資料都是最穩定的,但是效能也是最差的。資料庫的鎖實現就是這種隔離級別的更小粒度版本。
使用鎖的機制,在當前事務需要對資料修改時,將當前事務加上鎖,同乙個時間只允許一條事務修改當前資料,其他事務必須等待鎖釋放之後才可以操作。
使用版本來控制併發情況下的資料問題,在b事務開始修改賬戶且事務未提交時,當a事務需要讀取賬戶餘額時,此時會讀取到b事務修改操作之前的賬戶餘額的副本資料,但是如果a事務需要修改賬戶餘額資料就必須要等待b事務提交事務。
innodb的mvcc是通過在每行記錄後面儲存兩個隱藏的列來實現的。乙個儲存了行的事務id(db_trx_id),乙個儲存了行的回滾指標(db_roll_pt)。每開始乙個新的事務,都會自動遞增產 生乙個新的事務id。事務開始時刻的會把事務id放到當前事務影響的行事務id中,當查詢時需要用當前事務id和每行記錄的事務id進行比較。
資料庫事務的簡單介紹
事務就是使用者定義的一系列執行sql語句的操作,這些操作要麼完全地執行,要麼完全地都不執行,它是乙個不可分割的工作執行單元。事務的使用場景 在日常生活中,有時我們需要進行銀行轉賬,這個銀行轉賬操作背後就是需要執行多個sql語句,假如這些sql執行到一半突然停電了,那麼就會導致這個功能只完成了一半,這...
資料庫事務ACID問題介紹
一 事務的基本要素 acid 事務是由一組sql語句組成的邏輯處理單元,事務具有以下4個屬性,通常簡稱為事務的acid屬性。原子性 atomicity 指整個資料庫事務是不可分割的工作單位。只有使據庫中所有的操作執行成功,才算整個事務成功 事務中任何乙個sql語句執行失敗,那麼已經執行成功的sql語...
資料庫事務
事件是訪問並可能更新各種資料項的乙個程式執行單元。事件由事務開始與事務結束之間執行的全體操作組成。為了保證資料完整性,資料庫系統需要維護事務的以下性質 原子性 atomicity 事務中的操作要麼全部成功,要麼全部失敗。一致性 consistency 事務執行前後要保持資料庫的一致性。隔離性 iso...