begin; select*from tbl_user where user_name='user1'forupdate;
1 2 3 4 5 6 7
begin; insert into tbl_user (user_name,user_code,user_age) values('user1','u0006',40) //插入 user1 无法插入。 insert into tbl_user (user_name,user_code,user_age) values ('user11','u000100',100);//插入 user1 无法插入。 insert into tbl_user (user_name,user_code,user_age) values ('user10','u000100',100);//插入 user1 无法插入。 insert into tbl_user (user_name,user_code,user_age) values('user6','u0006',40) //能够成功插入 insert into tbl_user (user_name,user_code,user_age) values ('user2','u00020',100);//能够成功插入
在插入同样的数据的时候,MySQL 会阻塞当前插入,这样就能够给防止幻读的产生。
对于 user10, user11 无法插入,是因为 MySQL 对数据添加了写锁的同时,又对数据添加了间隙锁,当然这个间隙锁是有范围的。当插入 user2,user6 的时候又可以插入了。
全表扫描
1 2
begin; select * from tbl_user where user_age =10 for update;
1 2 3 4 5
begin; select*from tbl_user where user_name='user1'forupdate;//阻塞 select*from tbl_user where user_name='user2'forupdate;//阻塞 select*from tbl_user where user_age =10forupdate;//阻塞 select*from tbl_user where user_age =15forupdate;//阻塞