Chinaunix首页 | 论坛 | 博客
  • 博客访问: 75993
  • 博文数量: 29
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 302
  • 用 户 组: 普通用户
  • 注册时间: 2015-07-03 09:20
文章分类

全部博文(29)

文章存档

2015年(29)

我的朋友

分类: 系统运维

2015-07-30 10:41:45

mysql锁机制的认识:
两种基本锁:
共享锁(S),Share的缩写,共享锁的粒度是行或者元组(多个行),一个事务获得了共享锁之后,可以对锁定范围内的数据进行读操作。

排它锁(X),eXclusive的缩写,排它锁粒度和共享锁相同,也是行或者元组。一个事务获取了排它锁之后,可以对锁定范围内的数据进行写操作。

有两个事务t1和t2。
如果t1获得了一个元组的共享锁,事务t2还能获得这个元组的共享锁,但不能获得这个元组的排它锁(需要等待事务t1释放共享锁之后)。
如果t1获得了一个元组的排它锁,事务t2既不能获得这个元组的共享锁,也不能获得这个元组的排它锁(必须等待t1释放排它锁)。

意向锁
意向锁是一种表锁,锁的粒度是整张表。分为意向共享锁(IS)和意向排它锁(IX)。意向锁表示一个事务有意对数据上共享锁或排它锁。“有意” 是说该事务想做但是还没做。
假如一个事务t1执行了这样一条语句:select * from table lock in share model  ,如果这句执行成功,就对table上了一个意向共享锁。lock in share model 说明事务t1要在接下来执行的语句中获得S锁(共享锁)。如果t1的select * from table lock in share model执行成功,那么接下来t1应该可以畅通无阻的去执行只需要共享锁的语句了。意向排它锁的含义同理可知,上例中要获取意向排它锁,可以使用select * from table for update 

锁的互斥与兼容关系

锁和锁之间的关系,要么是相容的,要么是互斥的。

锁a和锁b相容是指:操作同样一组数据时,如果事务t1获取了锁a,另一个事务t2还可以获取锁b;

锁a和锁b互斥是指:操作同样一组数据时,如果事务t1获取了锁a,另一个事务t2在t1释放锁a之前无法获取锁b。

上面提到的共享锁、排它锁、意向共享锁、意向排它锁相互之前都是有兼容/互斥关系的,可以用一个兼容性矩阵表示(y表示兼容,n表示不兼容):

如果一个事务请求的锁模式和当前的锁模式兼容,innodb就将请求的锁授予该事务;反之,如果两者不兼容,该事务就要等待锁释放。
意向锁是innodb自动加的,无需用户干预。
对于update,delete,insert语句,innodb会自动给数据集加排它锁(X);对于普通的select语句,innodb不会加任何锁。事务可以通过lock in share mode/for update 显式给记录集加共享锁或者排它锁。
用select ... in share mode获得共享锁,主要用于需要数据依存关系时来确认某行记录是否存在,并确保没有人对该记录进行更新操作。如果当前事务同时也对该条记录进行更新操作,很可能会造成死锁。对于锁定行记录后需要进行更新操作的应用,应该使用select .... for update方式获得排它锁。


阅读(1149) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~