表共享读锁:一个读线程去小号,在门上挂了共享读锁,那么其他读线程也可以拿这个锁去小号,但是写线程想去大号,那不行!
表独占写锁:一个写线程去大号,在门上挂了独占写锁,那么其他线程大小号都不能上厕所!
共享锁:允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
加锁语句 : lock in share mode作用:所有事务都可以读,写要获得排他锁,但是共享锁与排他锁互斥。缺点:如果两个session都给一行数据加个共享锁,会导致一个连接死锁异常退出意义:提高读并发,避免脏读,RC级别隔离实现,一个事务读完了,提交后释放锁,其他事务才能更改RC实现:事务1 +lock in share mode 其他事务无法获得排他锁修改进入阻塞排他锁:允许获得排他锁的事务更新数据,阻止其它事务取得相同数据集的共享锁和排他锁
加锁语句 : for update作用:允许所有连接读这一行并且给这一行加共享锁,但是写不行缺点:并发性能降低,避免不可重复读意义:RR级别,一个事务写这行,其他事务读写都阻塞RR实现:事务1+ for update 其他事务无法获得排他锁和共享锁进入阻塞一致性:同一时间访问数据是一致的 隔离性:不同事务之间相互隔离互不干扰 如果数据库实现这两个特性,就意味着事务串行化,这与并发相背离!所以就有了隔离级别来满足不同场景下的并发要求。
因隔离性带来的并发问题? 脏写、脏读、不可重复读、幻读 参开文章MySQL提供的隔离级别? 未提交读、已提交读、可重复读、串行化,提供4种隔离级别来减小并发副作用四种隔离级别的实现原理? 锁机制,如上所述 SELECT LOCK IN SHARE MODE:共享锁 默认可重复读级别,事务1查询一行数据,其他事务不能对这一行修改 对比 在未提交读级别,加锁和不加锁情况下查询的结果 结论: 锁机制可以控制隔离级别 - 事务1 mysql sakila模型库 - 查看全局事务隔离级别 show global variables like '%isolation%'; - 设置隔离级别:读未提交、读已提交、可重复读(默认) set global transaction_isolation ='read-uncommitted'; set global transaction_isolation ='read-committed'; set global transaction_isolation ='REPEATABLE-READ'; set AUTOCOMMIT = 0; - 不加共享锁 SELECT actor_id, first_name, last_name FROM actor WHERE actor_id = 178; - 不加共享锁 SELECT actor_id, first_name, last_name FROM actor WHERE actor_id = 178 LOCK IN SHARE MODE; COMMIT; - 事务2 UPDATE actor SET last_name = 'MONROR B' WHERE actor_id = 178;SELECT FOR UPDATE:排他锁,比如seata代理的全局锁,避免脏写