1.事務處理
1.事務的概念
事務是針對資料庫的一組操作, 它可以由-一潭訓多條SQL陳述句組成,
2.事務的基本操作
在默認情況下,用戶執行的每一條SQL陳述句都會被當成單獨的事務自動提交,
如果要將一組SQL 陳述句作為-一個事務, 則需要先執行以下陳述句顯式地開啟一個事務,
START TRANSACTION;
此時,每一條SQL陳述句不再自動提交,用戶需要手動提交操作才會生效,
COMMIT;
如果不想提交當前事務,可以取消事務(即回滾),
ROLLBACK;
事務的執行要么成功,要么就回傳到事務開始前的狀態,這就保證了同一事務操作的同步性和資料的完整性,
MySQL中的事務必須滿足A、C、I、D這4個基本特性,
- Atomicity: 原子性
一個事務必須被視為一個不可分割的最小作業單元,只有事務中所有的資料庫操作都執行成功,才算整個事務執行成功,
- Consistency:一致性
一致性是指在事務處理時,無論執行成功還是失敗,都要保證資料庫系統處于一致的狀態,保證資料庫系統從不回傳到一個未處理的事務中,
- Isolation: 隔離性
隔離性是指當一個事務在執行時,不會受到其他事務的影響,保證了未完成事務的所有操作與資料庫系統的隔離,直到事務完成為止,才能看到事務的執行結果,
- Durability: 持久性
持久性是指事務一旦提交, 其對資料庫的修改就是永久性的,
3.事務的保存點
在回滾事務時,若希望只撤銷一部分,可以用保存點來實作,
SAVEPOINT 保存點名;
在設定保存點后,可以將事務回滾到指定保存點,
ROLLBACK TO SAVEPOINT 保存點名;
若不再需要一個保存點,使用如下陳述句洗掉,
RELEASE SAVEPOINT保存點名;
一個事務中可以創建多個保存點,在提交事務后,事務中的保存點就會被洗掉,
在回滾到某個保存點后,在該保存點之后創建過的保存點也會消失,
2.事務的隔離級別
事務隔離級的意義:
資料庫是一個多用戶的共享資源,MySQL允許多執行緒并發訪問,用戶可以通過不同的執行緒執行不同的事務,
為了保證這些事務之間不受影響,對事務設定隔離級是十分必要的,
1.查看事務隔離級別
#查看全域隔離級
SELECT @@global.transaction_ _isolation;
#查看當前會話中的隔離級
SELECT @@session.transaction_ isolation;
#查看下一個事務的隔離級
SELECT @@transaction_ isolation;
全域的隔離級:影響所有連接MySQL用戶,
當前會話隔離級:只影響當前正在登錄MySQL服務器的用戶,(不會影響其他用戶)
下一個事務的隔離級:僅對當前用戶的下一個事務操作有影響,
MySQL中事務的隔離級別:
- REPEATABLE READ:可重復讀
MySQL的默認事務隔離級,它解決了臟讀和不可重復讀的問題,
確保了同一事務的多個實體在并發讀取資料時,會看到同樣的結果,
- READ UNCOMMITTED:讀取未提交
事務中最低的級別,可以讀取到其他事務中未提交的資料,
也稱為臟讀(Dirty Read) :一個事務讀取了另外一個事務未提交的資料,
- READ COMMITTED:讀取提交
大多數DBMS (如SQL Server、Oracle) 的默認隔離級,但不包括MySQL,
只能讀取其他事務已經提交的資料,避免了臟讀問題,
但是會出現不可重復讀(NON-REPEATABLE READ)問題,
- SERIALIZABLE:可串行化
隔離級的最高級別,它在每個讀的資料行上加鎖,使之不會發生沖突,解決了臟讀、不可重復讀和幻讀的問題,
由于加鎖可能導致超時(Timeout) 和鎖競爭(Lock Contention)現象,性能是4種隔離級中最低的,
除非為了資料的穩定性,需要強制減少并發的情況時,才會選擇此種隔離級,
2.修改隔離級別
設定事務的隔離級別:
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL 引數值
- SESSION: 當前會話
- GLOBAL:全域
- 直接省略:下一個事務的隔離級
- TRANSACTION:事務
- ISOLATION:隔離
- LEVEL: 級別
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/131998.html
標籤:其他
