事務中的髒寫、髒讀、不可重複讀、幻讀
首先來說一下事務中會發生的問題:髒寫、髒讀、不可重複讀、幻讀
假設id=5的記錄最原始的username=“小王”
1.髒寫
sessionA | sessionB |
---|---|
begin //開啓事務 | |
begin//開啓事務 | |
update user set username=“張三” where id=5; | |
commit//提交事務 | |
update user set username=“李四” where id=5; | |
ROllBACK; | |
1.sessionA開啓了事務之後,緊接着sessionB也開啓了事務,那麼sessionB如果事務回滾就會回滾到最原始的記錄,也就是sessionB開啓事務之前的記錄,也就是username爲"小王"。
2.sessionA明明對id爲5的記錄進行了修改,而且sessionB也沒有進行事務提交,只是進行了事務的回滾,這種情況就稱爲髒寫。更改了別人修改的記錄。
2.髒讀
sessionA | sessionB |
---|---|
begin //開啓事務 | |
begin//開啓事務 | |
update user set username=“張三” where id=5; | |
select * from user where id =5; | |
COMMIT;//提交事務 | |
COMMIT;//提交事務 | |
sessionB會讀取到username爲張三的記錄,這種情況就是髒讀。
3.不可重複讀
sessionA | sessionB |
---|---|
begin //開啓事務 | |
select * from user where id =5; //讀取到的是小王 | |
update user set username=“張三” where id=5;//這裏有個隱式事務。自動提交 | |
select * from user where id =5; //讀取到的是張三 | |
commit; | |
上面這種情況就是不可重複情況,在一個開啓的事務中,同一個select語句能讀取到的其他事務修改的值。
4.幻讀
sessionA | sessionB |
---|---|
begin //開啓事務 | |
select * from user where id >=5; | |
insert into user(id,username) values(6,‘老李’);//隱式事務,自動提交 | |
select * from user where id >=5; 此時讀取到的就是除了之前有的 還多了一條老李的記錄 | |
commit; | |
幻讀就是相比第一條查詢,第二條查詢多了其他數據