柚子快報激活碼778899分享:Mysql中的事務
柚子快報激活碼778899分享:Mysql中的事務
目錄:?
一:事務的ACID特性及為什么要使用事務?
二:如何使用事務
三:事務的隔離級別
一:事務的ACID特性及為什么要使用事務?:
?1.事務的ACID特性:
事務的ACID特性指的是 Atomicity (原子性), Consistency (一致性), Isolation (隔離
性)和 Durability (持久性)。?
原子性:支持事務的數(shù)據(jù)庫中最基本的特性,一組SQL語句要么全部成功,要么全部失敗,不會出現(xiàn)只執(zhí)行了?半的情況,如果事務在執(zhí)行過程中發(fā)生錯誤,會回滾( Rollback )到事務開始前的狀態(tài)
,就像這個事務從來沒有執(zhí)行過?樣;
一致性:事務執(zhí)行完成后,保證數(shù)據(jù)正確并且符合預期?
?
隔離
性:多個事務之間不能相互影響?
持久性:事務一但提交就要保存到存儲介質(zhì)中(磁盤),不論數(shù)據(jù)庫是否損壞,都不會丟失數(shù)據(jù)
?
總結(jié):原子性,隔離性,持久性,共同作用實現(xiàn)一致性
2.為什么要使用事務:
事務具備的ACID特性,是我們使用事務的原因,在我們?nèi)粘5臉I(yè)務場景中有?量的需求要?事務來保證。支持事務的數(shù)據(jù)庫能夠簡化我們的編程模型, 不需要我們?nèi)タ紤]各種各樣的潛在錯誤和并發(fā)問題,在使?事務過程中,要么提交,要么回滾,不?去考慮?絡異常,服務器宕機等其他因素,因此我們經(jīng)常接觸的事務本質(zhì)上是數(shù)據(jù)庫對 ACID 模型的?個實現(xiàn),是為應用層服務的。?
因此在使用數(shù)據(jù)庫過程中,對于修改只要提交成功,數(shù)據(jù)就可以安全的保存,只要回滾就可以回到,保存點事務之初
二:如何使用事務:
1.查看支持事務的存儲引擎:在MySQL中支持事務的存儲引擎是InnoDB,可以通過
show engines;?
?
2.語法:
開始?個新的事務:start? transaction 或者 begin;
提交當前事務,并對更改持久化保存:commit;
回滾當前事務,取消其更改:rollback;?
??
例子1:開啟事務,執(zhí)行修改后回滾
1.開啟,并把張三和李四的balance字段分別加100和減100
回滾:數(shù)據(jù)回到初始狀態(tài)。
?例子2:開啟一個事務,執(zhí)行修改后提:
再查詢發(fā)現(xiàn)數(shù)據(jù)已被修改,說明數(shù)據(jù)已經(jīng)持久化到磁盤
?
?
3.設置保存點:??
語法:SAVEPOINT + 保持點名字;?
例子:張三李四分別修改了兩次,設置了兩個保存點,然后插入了一條數(shù)據(jù)
??
修改后:
?
?
回滾第二個保存點:
?
?
?
回滾到第一個保存點:?
?
?
?
回滾時不指定保存點,直接回滾到事務開始時的原始狀態(tài),事務關閉:?
?
?
?
?
4.提交事務:
默認情況下,MySQL是自動提交事務的,也就是說我們執(zhí)行的每個修改操作,比如插入、更新和刪除,都會自動開啟一個事務并在語句執(zhí)行完成之后自動提交,發(fā)生異常時自動回滾。?
?
查看當前事務是否?動提交可以使用:
show variables like 'autocommit';
?
??
?
通過以下語句設置事務為自動或手動提交:
# 設置事務?動提交
mysql> SET AUTOCOMMIT=1; # ?式?
mysql> SET AUTOCOMMIT=ON; # ?式?
# 設置事務?動提交
mysql> SET AUTOCOMMIT=0; # ?式?
mysql> SET AUTOCOMMIT=OFF; # ?式?
注意:
只要使? START TRANSACTION 或 BEGIN 開啟事務,必須要通過 COMMIT 提交才會持久
化,與是否設置 SET autocommit ?關。(總結(jié):開啟事務落盤必須提交)?
?
?三:事務的隔離級別:
1.什么是隔離級性:
MySQL服務可以同時被多個客戶端訪問,每個客戶端執(zhí)行的DML語句以事務為基本單位,那么不同的客戶端在對同?張表中的同?條數(shù)據(jù)進行修改的時候就可能出現(xiàn)相互影響的情況,為了保證不同的事務之間在執(zhí)行的過程中不受影響,那么事務之間就需要要相互隔離,這種特性就是隔離性。?
?
?
2.隔離級別:
事務間不同程度的隔離,稱為事務的隔離級別;不同的隔離級別在性能和安全方面做了取舍,有的隔離級別注重并發(fā)性,有的注重安全性,有的則是并發(fā)和安全適中;在MySQL的InnoDB引擎中事務的隔離級別有四種:
??
(1).?
READ UNCOMMITTED ,讀未提交?
(2).?
READ COMMITTED ,讀已提交
(3).?
REPEATABLE READ ,可重復讀(默認)
(4).?
SERIALIZABLE ,串行化?
?
注意:從上到下安全性逐漸升高,從下到上性能性逐漸升高
?
?
?
(1).?
READ UNCOMMITTED ,讀未提交
解釋:?
對應事務中,事務A對事務進行修改,但是事務B訪問了事務A未提交的數(shù)據(jù),這個情況叫做
臟讀
,
事務B讀到的是事務A回滾的數(shù)據(jù)??
例子:
??
(2).?
READ COMMITTED ,讀已提交
解釋
:?
事務A第一次查詢了某條記錄,事務B進行了修改并且提交,事務A再次查詢這條記錄發(fā)現(xiàn)與第一次
查詢結(jié)果不一致
,這種現(xiàn)象叫做
不可重復讀
(多次讀取到的結(jié)果不一致)??
例子:?
?
(3).?
REPEATABLE READ ,可重復讀(默認):?
?
事務A第一次查詢到的結(jié)果集,第二次以相同方式查詢到的結(jié)果集,與第一次的
結(jié)果集不一致
,這種現(xiàn)象叫做
幻讀??
?
注意:Mysql Innodb引擎使用了間隙鎖(next-key)鎖住了目標行和之前的信息,解決了部分幻讀問題
(MySQL中的間隙鎖(Gap Lock)是一種針對InnoDB存儲引擎的鎖定機制,用于鎖定一個范圍,但不包括記錄本身,主要用于防止幻讀。
間隙鎖只在可重復讀(REPEATABLE READ)事務隔離級別下工作。
)?
?
?例子:?
(4).?
SERIALIZABLE ,串行化?
:解決了所有數(shù)據(jù)安全問題,所有事務都是一個挨一個執(zhí)行,一個事務必須等到上一個事務執(zhí)行完成才可以執(zhí)行,解決了所有并發(fā)安全問題。?
?
?
??
3.查看和設置隔離級別:
這里注意Mysql事務隔離級別默認是,可重復讀(
REPEATABLE READ
) ;
兩個@@是表示查看系統(tǒng)變量。?
?
3.1.查看:
?
# 全局作?域
SELECT @@GLOBAL.transaction_isolation;
# 會話作?域
SELECT @@SESSION.transaction_isolation;
# 可以看到默認的事務隔離級別是REPEATABLE-READ(可重復讀)
?
?
?
?
?
3.2.設置:?
?
柚子快報激活碼778899分享:Mysql中的事務
參考閱讀
本文內(nèi)容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權,聯(lián)系刪除。