標籤: 事務
sql併發控制
死鎖資料庫恢復
2023年04月01日 20:38:29
1540人閱讀收藏
舉報資料庫(2)
目錄(?)
[+]1.事務(transaction
)的定義:指訪問並可能更新資料庫中各種資料項的乙個程式執行單元(unit)
包括:sql語句的集合,儲存過程體,高階語言的事件
2.事務的狀態
:active partially committed failed aborted committed
活動狀態
事務在執行時的狀態叫活動狀態。
部分提交狀態
事務中最後一條語句被執行後的狀態叫部分提交狀態。
失敗狀態
事務不能正常執行的狀態叫失敗狀態。
提交狀態
事務在部分提交後,將往硬碟上寫入資料,當最後一條資訊寫入後的狀態叫提交狀態。進入提交狀態的事務就成功完成了。
中止狀態
事務回滾並且資料庫已經恢復到事務開始執行前的狀態叫中止狀態
3.事務具有4個屬性:acid特性
原子性(atomicity)。乙個事務是乙個不可分割的工作單位,事務中包括的諸操作要麼都做,要麼都不做。
一致性(consistency)。事務必須是使資料庫從乙個一致性狀態變到另乙個一致性狀態。一致性與原子性是密切相關的。
隔離性(isolation)。乙個事務的執行不能被其他事務干擾。即乙個事務內部的操作及使用的資料對併發的其他事務是隔離的,併發執行的各個事務之間不能互相干擾。
永續性(durability)。永續性也稱永久性(permanence),指乙個事務一旦提交,它對資料庫中資料的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響
4.dbms的事務的兩個主要工作:恢復 併發控制 recovery & concurrency control ==事務管理
5.為什麼要併發控制:
a.增加處理器和硬碟的利用率
d.減少平均反應時間
c. 共享資源
d.隔離性的要求
6.schedule(計畫表) :一組事務的結合,並有相應事務的執行順序
分類:serial schedule(序列計畫表) equivalent schedule (等價計畫表)
7.每個事務有很多變數,事務獲取資料庫資源通過
read() write()
8.在交叉執行事務的時候,會因為 read 和write 順序不一樣出現錯誤。
衝突等價轉換:把相鄰操作交換順序而不引進衝突
衝突等價:可以通過衝突等價轉換的兩個計畫表
衝突序列化:乙個schedule 可以衝突等價於乙個序列的schedule
10.lock-based protocols :利用鎖的機制來保證序列化
操作:lock unlock
shared lock 共享鎖: 唯讀不寫 只有共享鎖之間才能對同乙個變數加鎖
exclusive lock 獨鎖: 可讀可寫 只要對某個變數加了獨鎖,那麼其他事務不能再附加任何鎖,包括共享鎖。
操作: s_lock(變數) s_unlock(變數) x_lock(變數) x_unlock(變數)
11. two phase locking
(2pl協議)
事務訪問變數前,必須在合適的位置加鎖。
如果某個變數的會產生衝突的鎖在其他事務那邊,改事務等待。
事務一旦釋放了某個鎖,就不能再獲取其他鎖
兩個階段:一:獲取鎖 二:釋放鎖
lock-point:封鎖點-------針對當前事務已經完成獲取鎖(最後乙個獲取鎖執行完之後的點)
(每個事務都保證了,先獲取鎖,後釋放鎖,都有乙個lock-point)
只要符合 2pl協議的schedule都是可以線性化的。
該協議是阻塞協議(blcoking protocol):因為事務會發生等待,該協議下灰產生死鎖
死鎖1.死鎖的解決辦法:
ostrich(鴕鳥):假裝什麼事情都沒有發生
timeout :超過時間,就採取措施
檢測和恢復: 維持乙個等待圖來檢測是否有死鎖發生,通常採用回滾(rollback==abort restart)
避免死鎖
預防法2.鎖的機制的目的就是保證珂序列化(這樣就是安全的)
3.一致性的4個級別:
讀取尚未由其他事務提交的修改後的資料值,這些行為稱為「髒」讀
。read committed(nonrepeatable reads)是sql server預設的隔離級別。該級別通過指定語句不能讀取其他事務已修改但是尚未提交的資料值,禁止執行髒讀。在當前事務中的各個語句執行之間,其他事務仍可以修改、插入或刪除資料,從而產生無法重複的讀操作,或「影子」資料
。比如,事務1讀取了一行,事務2修改或者刪除這一行並且提交。如果事務1想再一次讀取這一行,它將獲得修改後的資料或者發現這一樣已經被刪除,因此事務的第二次讀取結果與第一次讀取結果不同,因此也叫不可重複讀。
該級別包括read committed,並且另外指定了在當前事務提交之前,其他任何事務均不可以修改或刪除當前事務已讀取的資料。併發性低於read committed,因為已讀資料的共享鎖在整個事務期間持有,而不是在每個語句結束時釋放。也叫可重複讀。
serializable 是限制性最強的隔離級別,因為該級別鎖定整個範圍的鍵,並一直持有鎖,直到事務完成。該級別包括repeatable read,並增加了在事務完成之前,其他事務不能向事務已讀取的範圍插入新行的限制
恢復:recovery
1.失敗的型別:
事務失敗:邏輯錯誤 系統錯誤(死鎖)
系統崩潰 system crash
磁碟失敗
2.為什麼要恢復: 為了確保原子性,永續性
3. 確保原子性需要:找到那些事務,開始了卻沒有成功提交的; find 事務對資料庫做出的改變,然後undo
all the changes
4.即使事務被提交了,但是仍然可能破壞原子性(可能還在緩衝區,沒有寫到磁碟上)。確保committed之後flush一下。使緩衝區的內容寫到磁碟上。
5、確保永續性:找到所有事務已經成功提交的,確保都已經報修改寫到磁碟,否則redo all changes
6.還記得acid嗎,i :隔離性就是在併發控制的時候 c:一致性,就是那個四個級別。
7.恢復的演算法要求我們儲存足夠的資訊,使系統能夠從失敗處恢復,同時使系統恢復的操作符合acid中的acd
足夠資訊:利用穩定的儲存器儲存有用資訊, 日記(logs)
8.logs
維護了資料庫更新活動的記錄。
日記一定要是 write-ahead logs (wal): 所有的操作一定要先記錄,被儲存在穩定的儲存器上(在操作執行前)
9.兩個操作 undo redo
mysql 併發控制及事務
實現的併發訪問的控制技術是基於鎖 鎖分為表級鎖和行級鎖,myisam儲存引擎不支援行級鎖 innodb支援表級鎖和行級鎖 鎖的分類有讀鎖和寫鎖,讀鎖也被稱為共享鎖,加讀鎖的時候其他的人可以讀 寫鎖也稱為獨佔鎖或排它鎖,乙個寫鎖會阻塞其他讀操作和寫操作 鎖還分為隱式鎖和顯式鎖,隱式鎖由儲存引擎自行管理...
事務併發 樂觀鎖
怎樣實現事務的隔離呢?隔離機制的實現必須使用鎖 serializable隔離級別最高,效率最低 一般都不修改隔離級別,如果要改,問dba 資料庫管理員 新增乙個私有欄位integer version,不由程式設計師維護,由jpa自己維護 version private integer version...
ORACLE 事務併發 鎖
首先了解乙個概念,沒有併發就沒有鎖。select s.sql id,parsing schema name,sql fulltext,t.status start time,last active time,last load time from v transaction t,v sql s wh...