关于mysql中innodb的锁机制

(随便记两笔,感觉读锁和写锁没区别啊)
锁的粒度是指锁的作用范围,服务器级锁和存储引擎级锁,myisam支持表锁,innodb支持表锁和行锁。
mysql锁分为显示锁和隐式锁,mysql自己加的就是隐式锁,开发人员自己加的就是显式锁。

行级锁:分为共享锁和排他锁。 开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
读锁(read lock),共享锁。写锁自己可以读写,其他人可以读不能写。其他的操作在你释放后一次执行。可以在数据上面再加读锁,加写锁要排队。
start transaction;
SELECT ... LOCK IN SHARE MODE;对读取的每一行加上共享锁。
commit work;


写锁(write lock),排他锁,独占锁。 读锁自己可以读可以写,其他人可以读不能写,别人如果修改了会被堵塞,等你提交了那边的修改就会执行。可以在数据上面再加读锁,写锁但是要排队。
start transaction;
select * from user where id=3 for update;
commit work;
读锁和写锁都是行级锁,都属于悲观锁。innodb的行锁都是通过索引上的索引项加锁来实现的,没有索引通过隐藏的聚集索引来记录加锁。实在找不到索引无法确定行锁就会锁住整个表,即使sql语句中使用了索引如果mysql认为不用索引效率更高还是会表锁。

乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。

乐观锁(OCC):乐观并发控制,它假设多用户并发的事务在处理时不会彼此互相影响,各事务能够在不产生锁的情况下处理各自影响的那部分数据。在提交数据更新之前,每个事务会先检查在该事务读取数据后,有没有其他事务又修改了该数据。如果其他事务有更新的话,正在提交的事务会进行回滚

悲观锁(PCC):使用悲观锁需要先设置数据库关闭自动提交,set autocommit=0。只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据。

 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。

lock table user read/write;加锁 unlock tables;解锁;这是对整个表加锁。
读锁自己可以读不能写,其他人可以读不能写,别人如果修改了会被堵塞,等你释放了那边的修改就会执行。可以在数据上面再加读锁。不能加写锁

猜你喜欢

转载自www.cnblogs.com/wl-sjy/p/9075584.html