MySQL 中 InnoDB 存儲引擎提供了事務(wù)隔離級別,其中包括四種:讀未提交,讀提交,可重復(fù)讀和串行化。
今天我們討論的是其中兩種隔離級別:讀提交和可重復(fù)讀。
讀提交(Read Committed)
讀提交是 InnoDB 的默認事務(wù)隔離級別,并且是大部分應(yīng)用所使用的級別。讀提交的意思是一個事務(wù)只能看到已經(jīng)提交的事務(wù)所做的修改。如果一個事務(wù)正在進行中,而且對某個數(shù)據(jù)行進行了修改,那么在該事務(wù)提交之前,其他事務(wù)是看不到這個修改的。
按照正常的操作流程,讀提交的行為規(guī)則如下:
-- 啟用讀提交事務(wù)隔離級別 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 創(chuàng)建一個示例表 CREATE TABLE test_table ( id INT PRIMARY KEY, name VARCHAR(16) ); -- 在一個事務(wù)中插入數(shù)據(jù)并提交 START TRANSACTION; INSERT INTO test_table (id, name) VALUES (1, 'Hello'); COMMIT; -- 在另一個事務(wù)中查詢數(shù)據(jù),此時只能查詢到已經(jīng)提交的數(shù)據(jù) START TRANSACTION; SELECT id, name FROM test_table WHERE id = 1; COMMIT;
可重復(fù)讀(Repeatable Read)
可重復(fù)讀是比較常用的事務(wù)隔離級別之一,在 MySQL 中也被稱為默認的事務(wù)隔離級別。與讀提交不同,可重復(fù)讀允許一個事務(wù)內(nèi)多次讀取同一數(shù)據(jù)行時,保持這些數(shù)據(jù)的一致性,即在一個事務(wù)中第一次讀取某個數(shù)據(jù)行時,該數(shù)據(jù)行所做的任何修改對后續(xù)讀取都是不可見的。
按照正常的操作流程,可重復(fù)讀的行為規(guī)則如下:
-- 啟用可重復(fù)讀事務(wù)隔離級別 SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; -- 在一個事務(wù)中查詢數(shù)據(jù)并提交 START TRANSACTION; SELECT id, name FROM test_table WHERE id = 1; COMMIT; -- 在另一個事務(wù)中修改數(shù)據(jù)時,之前查詢的數(shù)據(jù)行不受影響 START TRANSACTION; UPDATE test_table SET name = 'World' WHERE id = 1; COMMIT; -- 再次查詢數(shù)據(jù)時,仍能查詢到與之前一致的數(shù)據(jù) START TRANSACTION; SELECT id, name FROM test_table WHERE id = 1; COMMIT;
總的來說,在實際應(yīng)用中根據(jù)業(yè)務(wù)需求選擇合適的事務(wù)隔離級別是很重要的,不當(dāng)?shù)倪x擇可能導(dǎo)致數(shù)據(jù)不一致或者性能下降。
上一篇python 小兔子
下一篇python+求auc