MySQL數(shù)據(jù)庫提供了四個(gè)事務(wù)隔離級(jí)別:讀未提交,讀已提交,可重復(fù)讀以及串行化。不可重復(fù)讀(Non-repeatable Read)是指在同一事務(wù)中,讀取同一記錄的兩次查詢結(jié)果不同。由于在此過程中出現(xiàn)了未提交的數(shù)據(jù),所以導(dǎo)致了數(shù)據(jù)的不一致。
CREATE TABLE user ( id INT(11) PRIMARY KEY, name VARCHAR(20) NOT NULL, age INT(11) NOT NULL, phone VARCHAR(20) NOT NULL ); -- 添加數(shù)據(jù) INSERT INTO user (id, name, age, phone) VALUES (1, '小明', 25, '123456789');
比如,在事務(wù)A中執(zhí)行如下SQL:
START TRANSACTION; SELECT * FROM user WHERE id = 1; -- 查詢結(jié)果為 {1, '小明', 25, '123456789'} -- 事務(wù)B修改了數(shù)據(jù) UPDATE user SET name = '小紅' WHERE id = 1; SELECT * FROM user WHERE id = 1; -- 查詢結(jié)果為 {1, '小紅', 25, '123456789'} COMMIT;
而在事務(wù)A中,第一次讀取到的用戶信息與第二次讀取到的用戶信息不一致,這就是不可重復(fù)讀的現(xiàn)象。
因此,為解決此類問題,我們可以使用MySQL提供的可重復(fù)讀隔離級(jí)別,保證在同一事務(wù)中多次讀取同一記錄的結(jié)果相同。