数据库封锁
‘壹’ 数据库中x封锁与s封锁有什么区别
数据库中X封锁和S封锁的区别如下:
1、两种封锁共享上的区别:
排它锁(记为X锁),又叫写锁;共享锁(记为S锁),又叫读锁。读锁是共享的,或者说是相互不阻塞的。写锁是排他的,一个写锁会阻塞其他的写锁和读锁。
2、读取权限上的区别:
若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。
3、修改权限上的区别
若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
(1)数据库封锁扩展阅读:
数据库中封锁的对象:
封锁是实现并发控制的一个非常重要的技术。DBMS通常提供了多种类型的封锁。一个事务对某个数据对象加锁后究竟拥有什么样的控制是由封锁的类型决定的。
封锁的对象可以是逻辑单元,也可以是物理单元。逻辑单元: 属性值、属性值集合、元组、关系、索引项、整个索引、整个数据库等;物理单元:页(数据页或索引页)、块等。
封锁对象可以很大也可以很小,例如对整个数据库加锁、对某个属性值加锁。封锁对象的大小称为封锁的粒度。封锁的粒度越大,系统中能够被封锁的对象就越少,并发度也就越小,但系统开销也越小;封锁的粒度越小,并发度越高,但开销也就越大。
参考资料来源:网络-封锁
‘贰’ 都有什么情况会导致数据库锁表呢
数据库锁表:在数据库里,同一个数据可能有多个人来读取或更改,为了防止更改的时候别人也同时更改,这里一般要锁住表不让别人改。当然还有其它各种复杂情况。
数据库锁从类型上讲,有共享锁,意向锁,排他锁。从锁的粒度角度来说,可以分为为行、页键、键范围、索引、表或数据库获取锁。(锁粒度是被封锁目标的大小,封锁粒度小则并发性高,但开销大,封锁粒度大则并发性低但开销小)
可能的原因有:
(1)字段不加索引:在执行事务的时候,如果表中没有索引,会执行全表扫描,如果这时候有其他的事务过来,就会发生锁表!
(2)事务处理时间长:事务处理时间较长,当越来越多事务堆积的时候,会发生锁表!
(3)关联操作太多:涉及到很多张表的修改等,在并发量大的时候,会造成大量表数据被锁!
出现锁表的解决方法有:
(1)通过相关的sql语句可以查出是否被锁定,和被锁定的数据!
(2)为加锁进行时间限定,防止无限死锁!
(3)加索引,避免全表扫描!
(4)尽量顺序操作数据!
(5)根据引擎选择合理的锁粒度!
(6)事务中的处理时间尽量短!
生产中出现死锁等问题是比较严重的问题,因为通常死锁没有明显的错误日志,只有在发现错误的时候才能后知后觉的处理,所以,一定要尽力避免!
(2)数据库封锁扩展阅读:
封锁是指事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象。
锁表的基本类型有:
(1)排它锁(记为X锁)
排它锁又称为写锁。若事务T 对数据对象A 加上X 锁,则只允许T 读取和修改A , 其它任何事务都不能再对A 加任何类型的锁,直到T 释放A 上的锁。
(2)共享锁(记为S锁)
共享锁又称为读锁。若事务T 对数据对象A 加上S 锁,则其它事务只能再对A 加S 锁,而不能加X 锁,直到T 释放A 上的S 锁。X锁和S锁都是加在某一个数据对象上的。
封锁单元有:
封锁的对象可以是逻辑单元,也可以是物理单元。
逻辑单元: 属性值、属性值集合、元组、关系、索引项、整个索引、整个数据库等;
物理单元:页(数据页或索引页)、块等。
封锁对象可以很大也可以很小,例如对整个数据库加锁、对某个属性值加锁。封锁对象的大小称为封锁的粒度。封锁的粒度越大,系统中能够被封锁的对象就越少,并发度也就越小,但系统开销也越小;封锁的粒度越小,并发度越高,但开销也就越大。
选择封锁粒度时必须同时考虑开销和并发度两个因素,进行权衡,以求得最优的效果。
一般原则为:
(1)需要处理大量元组的用户事务:以关系为封锁单元;
(2)需要处理多个关系的大量元组的用户事务:以数据库为封锁单位;
(3)只处理少量元组的用户事务:以元组为封锁单位