共享锁(S锁)和排它锁(X锁)

共享锁【S锁】
又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。共享锁是造成上锁对象必须被大家共享,它排斥 排他锁,因此别的会话不能独占资源对其修改(“修改”会先给修改对象加上 排他锁 的)。但不排斥其他共享锁,所以一个对象可被多个会话同时加上共享锁。

排他锁【X锁】
又称写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。排他锁很好理解,是自己独占资源。其它会话想再在同一对象上加共享或排他锁都是不允许的。不过其它会话可以读,这也证明普通的读是不上锁的。如果查的对象被修改,查询操作还会会被重定向到对应的撤销块(原来的数据),以保证事务事物隔离和读一致;

 

简单地讲,当我们需要修改表结构的时候(如,create index,alter table add|drop column,修改表字段属性),就需要在表上加表级共享锁。需要对某条记录执行DML操作的时候,就需要对被操作记录加上行级排它锁。锁是自动加上的,不需要我们手工加锁,如果需要用户手工加锁的话,一般是lock xxxxx;的方式。

 

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

 

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

2.上锁对象可以是表,也可以是表里面的行(是整个行,给行上了排他锁后,所有字段的数据都不许别人动)。

 

锁跟事务是联系在一起的,锁的生命周期是事务开始到事务结束(不管是提交还是回滚都是结束)

 

参考:

http://www.itpub.net/thread-1829284-1-1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值