這篇文章給大家介紹怎么在mysql中實現(xiàn)事務(wù)的隔離級別,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
目前創(chuàng)新互聯(lián)已為上千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站改版維護、企業(yè)網(wǎng)站設(shè)計、昌邑網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。事務(wù)就是一組一起成功或一起失敗的sql語句。事務(wù)還應(yīng)該具備,原子性,一致性,隔離性和持久性。
一、事務(wù)的基本要素 (ACID)
1、原子性:事務(wù)開始后,所有的操作,要么全部成功,要么全部失敗,不可能處于中間狀態(tài),事務(wù)是一個不可分割的整體,就像原子一樣。
2、一致性:事務(wù)開始前和結(jié)束后,數(shù)據(jù)庫的完整性約束沒有破壞,A向B轉(zhuǎn)賬,A扣了錢,但B卻沒到賬。
3、隔離性:同時發(fā)生的事務(wù)(并發(fā)事務(wù))不應(yīng)該導(dǎo)致數(shù)據(jù)庫處于不一致的狀態(tài)中,每個事務(wù)都獨立執(zhí)行,不影響其他事務(wù)的存在。
4、持久性:事務(wù)對數(shù)據(jù)庫的更改都會保存在磁盤上,不會丟失。
二、事務(wù)的并發(fā)問題
1、臟讀:事務(wù)A讀取了事務(wù)B未提交的寫入數(shù)據(jù),讀取到的數(shù)據(jù)就稱為臟數(shù)據(jù)
2、不可重復(fù)讀:事務(wù)A多次讀取同一數(shù)據(jù),但在讀取過程中,事務(wù)B對數(shù)據(jù)做了修改,并提交了。導(dǎo)致多次讀取同一數(shù)據(jù),結(jié)果不一樣。
3、幻讀:事務(wù)A對表中所有數(shù)據(jù)行進行了修改,比如設(shè)置status = 1,但同時,事務(wù)B往該表插入了一行新數(shù)據(jù)status = 0,對于操作事務(wù)A的用戶而言,表中還有一條記錄沒被修改,就像發(fā)生幻覺一樣。
三、事務(wù)隔離性的四個級別
事務(wù)隔離級別 | 臟讀 | 不可重復(fù)讀 | 幻讀 |
讀取未提交 read uncommitted | √ | √ | √ |
讀已提交 read committed | × | √ | √ |
可重復(fù)讀取 repeatable read | × | × | √ |
序列化 serializable | × | × | × |
四、獲取和設(shè)置數(shù)據(jù)庫隔離級別
SHOW VARIABLES LIKE '%isolation%'; SHOW GLOBAL VARIABLES LIKE '%isolation%';
使用系統(tǒng)變量查詢
SELECT @@GLOBAL.tx_isolation; SELECT @@SESSION.tx_isolation; SELECT @@tx_isolation;
對于mysql8而言,使用下面的變量進行查詢
SELECT @@GLOBAL.transaction_isolation; SELECT @@SESSION.transaction_isolation; SELECT @@transaction_isolation;
設(shè)置隔離級別
SET GLOBAL tx_isolation = '隔離級別'; SET SESSION tx_isolation = '隔離級別'; SET @@tx_isolation = '隔離級別';
對于mysql8而言,使用下面語句進行設(shè)置
SET GLOBAL transaction_isolation = '隔離級別'; SET SESSION transaction_isolation = '隔離級別'; SET @@transaction_isolation = '隔離級別';
五、通過例子說明各隔離級別的情況
先準備一張表,和一點數(shù)據(jù)。
CREATE TABLE `account` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `name` varchar(32) DEFAULT '' COMMENT '名稱', `money` decimal(11,2) DEFAULT '0.00' COMMENT '金錢', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO `account` (`name`, `money`) VALUES ('A', '500.00'); INSERT INTO `account` (`name`, `money`) VALUES ('B', '100.00');
1、讀取未提交
set transaction_isolation = 'READ-UNCOMMITTED'; set autocommit = 0;
事務(wù)B修改了表中的數(shù)據(jù),但是未提交,事務(wù)A確讀取到了修改后的數(shù)據(jù)。如果因為某些原因,事務(wù)B回滾了,事務(wù)A讀取的這個數(shù)據(jù)就是臟數(shù)據(jù)。
2、讀已提交
set transaction_isolation = 'READ-COMMITTED'; set autocommit = 0;
事務(wù)B修改數(shù)據(jù)但沒有提交,那么事務(wù)A仍然獲取的原來數(shù)據(jù),解決了臟讀的問題。
但是事務(wù)B提交,事務(wù)A執(zhí)行上一次查詢,結(jié)果與上一次查詢不一致,這就產(chǎn)生不可重復(fù)讀的問題。
3、可重復(fù)讀取
set transaction_isolation = 'REPEATABLE-READ'; set autocommit = 0;
事務(wù)B修改了數(shù)據(jù)并提交了,事務(wù)A兩次查詢的結(jié)果是一致的,解決了不可重復(fù)讀的問題。
這個時候,事務(wù)A去修改name為A的money數(shù)據(jù)
name為A的money變成了350,而不是400,可重復(fù)讀保證了數(shù)據(jù)的一致性。
我們重新在事務(wù)A中修改所有賬號的money等于200,同時在事務(wù)B中插入一條新的數(shù)據(jù)。
事務(wù)A中獲取的仍然是兩條數(shù)據(jù),解決了新增數(shù)據(jù)時,事務(wù)A出現(xiàn)的幻讀問題。
4、序列化
set transaction_isolation = 'SERIALIZABLE'; set autocommit = 0;
事務(wù)A對表進行查詢,如果沒有提交,則事務(wù)B的插入語句一直等待在那里,直到超時或事務(wù)A提交。
反之,事務(wù)B對表進行插入后,沒有提交,則事務(wù)A對表的查詢也一直等待,直到事務(wù)B提交。
此時對表的讀寫都會進行鎖表,當然對并發(fā)性能的影響也比較大。
隔離級別越高,越能保證數(shù)據(jù)的完整性和一致性。
六、mysql的鎖
鎖分為兩種類型:
內(nèi)部鎖:mysql服務(wù)器內(nèi)部執(zhí)行的內(nèi)部鎖,以管理多個會話對表內(nèi)容的爭用。
外部鎖:mysql為客戶會話提供顯式地獲取表鎖,以阻止其他會話訪問表。
內(nèi)部鎖又會為兩種類型:
1、行級鎖:行級鎖是細粒度的,只有被訪問的行會被鎖定,這允許多個會話同時進行寫訪問。
2、表級鎖:mysql對myisam,memory和merge表使用表級鎖,一次只允許一個會話更新表,這使得這些存儲引擎更適用于以讀取為主的操作。
外部鎖:可以使用 LOCK TABLE 和 UNLOCK TABLE 來控制鎖定。
READ (共享鎖) :多個會話可以從表中讀取數(shù)據(jù)而不需要獲取鎖,此外,多個會話可以在同一表上獲得鎖,當 READ 鎖時,沒有會話可以將數(shù)據(jù)寫入表中。任何寫入操作都將處于等待狀態(tài),直到 READ 鎖被釋放。
WRITE (排他鎖) :當表被 WRITE 鎖定時,除持有該鎖的會話外,其他會話都不能讀取或?qū)懭霐?shù)據(jù),除非 WRITE 鎖被釋放。
鎖表的語句:
LOCK TABLES table_name [READ | WRITE];
解鎖表的語句:
UNLOCK TABLES;
鎖定數(shù)據(jù)庫中所有表:
FLUSH TABLES WITH READ LOCK;
關(guān)于怎么在mysql中實現(xiàn)事務(wù)的隔離級別就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。