MySQL是一個常用的關系型數(shù)據(jù)庫管理系統(tǒng),為了保證數(shù)據(jù)的一致性和完整性,它提供了多種并發(fā)控制機制。其中之一就是可重復讀(Repeatable Read)。
可重復讀是MySQL的默認事務隔離級別,它的作用是保證在同一事務內多次讀取同一數(shù)據(jù)時,得到的結果是一致的。
BEGIN; SELECT * FROM users WHERE id=1; -- 此時獲取了id為1的用戶信息,如{id:1, name:'Tom', age:25, gender:'M'} -- 并發(fā)事務更改了id為1的用戶的name和age UPDATE users SET name='Sam' WHERE id=1; UPDATE users SET age=26 WHERE id=1; -- 重新獲取id為1的用戶信息 SELECT * FROM users WHERE id=1; -- 在可重復讀的隔離級別下得到的結果仍是{id:1, name:'Tom', age:25, gender:'M'},而不是{name:'Sam', age:26}的結果 COMMIT;
可重復讀的作用在于,在并發(fā)環(huán)境下,避免對同一數(shù)據(jù)進行多次操作,導致數(shù)據(jù)的不一致性。在某些對數(shù)據(jù)一致性要求較高的業(yè)務場景中,可重復讀是非常有用的。
不過需要注意的是,在可重復讀隔離級別下,數(shù)據(jù)的更新并不會立即生效,而是在事務提交后才會生效。這意味著,如果事務A中先讀取了一條數(shù)據(jù),再將其更改,并提交了事務,之后事務B讀取該數(shù)據(jù),此時讀取到的數(shù)據(jù)已經(jīng)是更新后的值。但是在事務B中,如果再次讀取該數(shù)據(jù),會發(fā)現(xiàn)其值與之前讀取時一致,因為事務B并沒有發(fā)現(xiàn)事務A已經(jīng)更改了該數(shù)據(jù)。
-- 事務A讀取數(shù)據(jù)并更新 BEGIN; SELECT age FROM users WHERE id=2; -- 此時獲取age為25的用戶信息 UPDATE users SET age=26 WHERE id=2; COMMIT; -- 事務B讀取數(shù)據(jù) BEGIN; SELECT age FROM users WHERE id=2; -- 此時獲取age為26的用戶信息 -- 重新獲取數(shù)據(jù) SELECT age FROM users WHERE id=2;-- 此時仍然獲取age為25的用戶信息 COMMIT;
因此,可重復讀并不能完全解決并發(fā)帶來的問題,需要視業(yè)務場景選擇合適的事務隔離級別。
上一篇mysql什么語言
下一篇css中img居中鋪滿