结合例子理解排他(exclusive)锁和共享(shared)锁



结合例子理解排他(exclusive)锁和共享(shared)锁


锁跟事务是联系在一块儿的,锁的生命周期是事务开始到事务结束(无论是提交仍是回滚都是结束)。 
因此,讲到锁就不能回避事务而单单去讲锁的含义。
但咱们仍是先讲例子再讲锁的定义.
首先,根据锁类型划分有排他(exclusive)锁和共享(shared)锁。




下面举例:
经过DML语句对一张表的某一行数据进行修改,一个事务开始,背后的步骤是:
1.对这张表加一个共享锁。这么作是为了防止别的会话经过DDL语句修改这张表的表结构。DDL语句要修改了这张表,
就必须给表加上排他锁。可是如今给表加了共享锁了,也就排斥了DDL去加排他锁;
2.对修改的那一行加一个排他锁,别的会话不能修改这一行。可是我对整张表加的是共享锁而不是排他锁,
因此别的会话仍是能够修改其余行(也经历一、2两个步骤)


这样,对于共享和排它的含义应该清楚了。




定义: 注意:这里用“修改”这个词取代真实的DML或DDL操做。
1.排他锁:排他锁很好理解,是本身独占资源。其它会话想再在同一对象上加共享或排他锁都是不容许的。不过其它会话能够读,
这也证实普通的读是不上锁的。若是查的对象被修改,查询操做还会会被重定向到对应的撤销块(原来的数据),
以保证事务事物隔离和读一致;


2.共享锁:共享锁是形成上锁对象必须被你们共享,它排斥 排他锁,所以别的会话不能独占资源对其修改
(“修改”会先给修改对象加上 排他锁 的)。但不排斥其余共享锁,因此一个对象可被多个会话同时加上共享锁。


有两点补充:
1.锁的意义就是为了保护对象,因此它们其实有一个共同的目的,那就是不容许其它会话对个人上锁对象自己进行修改。
对表而言是表结构,对行而言是每一个字段的数据。


2.上锁对象能够是表,也能够是表里面的行(是整个行,给行上了排他锁后,全部字段的数据都不准别人动)。
可是给行加共享锁是没意义的,由于锁定一行就是为了本身能修改而别人不能,上共享锁本身也不能修改了
(说的有点牵强,但愿多思考一下)