一、加锁常用命令
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 事务不可重复读。