mysql 锁知识

一、加锁常用命令

1.修改隔离级别
set session transaction isolation level read uncommitted; 修改全局隔离级别为 读未提交
set global transaction isolation level read uncommitted; 修改当前事务隔离级别为读未提交

–1:Read Uncommitted

–2:Read Committed

–4:Repeatable Read

–8:Serializable 

2.查询数据库隔级别
select @@global.tx_isolation;

一、加锁测试

1.开启一个事务,让等待10s 后提交释放锁
START TRANSACTION;  

SELECT idd from iodn_area where idd>7 FOR UPDATE;  

select SLEEP(10); 

COMMIT; 
2.在另一个事务中更新某一行记录
update iodn_area set area_name ='wuqu' where idd=119;

3.总结:当第一个事务加锁命中索引后,锁定的是一行记录,当在第二个事务中更新同一行记录是要等待第一个事务执行完毕,如果没有命中索引,则锁定整个表,无论第二个事务更新哪行记录都是不行的。

 二、不可重复读测试

A 事务
START TRANSACTION;  

SELECT city_id from iodn_area where idd=107 ; 

查询后使用B 事务更新city_id

SELECT city_id from iodn_area where idd=107 ; 
COMMIT; 

总结:首先不可重复读是在一个事务内而定义的,在A事务内的两次查询结果不一样,而本次测试结果是两次查询结果一样,原因是mysql 默认的隔离级别是repeatable-read ,通过mvcc多版本控制已经解决了不可重复读的问题

 三、读未提交 测试

读未提交比较简单,主要是A 事务在事务内 读到了 B 事务未提交的数据,当B 事务故障后发生故障导致回滚,那么A 事务就读到了脏数据

四、读已经提交测试

读已经提交和未提交差不多,只不过A事务读取到了B事务已经提交的数据,导致A 事务不可重复读。

原文地址:https://www.cnblogs.com/lufei33180/p/14267607.html