mysql的锁
1) innoDB的两种行锁
共享锁(shared lock):读锁,就是多个事务只能读取数据不能修改数据。
排他锁(exclusive lock):写锁,一个事务对一条记录加上排他锁,其他事务不能对该记录加其他的锁。事务可以通过以下语句显式给记录集加共享锁或排他锁:
共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。
排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE。
InnoDb行锁是通过给索引上的索引项加锁来实现的,这一点mysql与oracle不同,oracle是通过在数据块中对相应数据行加锁来实现的。InnoDb的这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDb才会使用行级锁,否则InnoDb将使用表锁。
2)间隙锁 - 行锁
当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDb会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但不存在的记录,叫做间隙(GAP),InnoDb也会对这个“间隙”加锁,这种机制就是所谓的“间隙锁”。
3) 悲观锁和乐观锁 - 行锁
悲观锁和乐观锁都是一种思想,并不是真实存在于数据中的一种机制。
4)意向锁-表锁
- 意向共享锁:表达一个事务想要获取一张表中某几行的共享锁。
- 意向排他锁:表达一个事务想要获取一张表中某几行的排他锁。
5) 自增长锁-表锁
自增长锁是一种特殊的表锁机制,提升并发插入性能。对于这个锁有几个特点:
- 在sql执行完就释放锁,并不是事务执行完。
- 对于Insert。。。select大数据量插入会影响插入性能,因为会阻塞另外一个事务执行。
- 自增算法可以配置。
获取锁的类型的sql
show variables like 'innodb_autoinc_lock_mode';
如何防止死锁
- 以固定的顺序访问表和行。交叉访问更容易造成事务等待回路。
- 尽量避免大事务,占有的资源锁越多,越容易出现死锁,可以拆成小事务。