【数据库】封锁技术

来源:互联网 发布:数据透视表显示合计 编辑:程序博客网 时间:2024/06/06 03:52

一、前言:

    数据库的并发操作通常会带来三个问题:丢失更新、读脏数据、不可重复读。解觉这些问题就需要用到数据库的封锁机制进行控制,但封锁机制的引入又引起了一系列问题:性能下降、死锁等。

    1、丢失更新:一个事务的更新覆盖了其他事务的更新结果。例如用户A把值从8改到了5,用户B把值从5改到了8,则用户A丢失了它的更新。

    2、读脏数据:事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,事务T1由于某种原因被撤销,这时事务T1修改过的数据恢复原值,事务T2督导的数据就和数据库中的数据不一致,是错误的数据。又称“脏”数据。

    3、不可重复读:事务T1读取数据后,事务T2执行了更新操作。而事务T1使用的仍然是更新前的值,造成了数据不一致性。

        为了解决这些并发操作带来的问题。我们需要引入并发控制。主要方法是封锁技术。


二、封锁技术:

    锁分为两种:一种是排他型锁(X锁),另一种是共享型锁(S锁)。

    1、排他锁:若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他事务都不能再对A加任何类型的所。直到T释放A上的锁。可见X锁只允许一个事务独锁某个数据,具有排他性。

    2、共享锁:若事务T对数据对象A加上S锁,则只允许T读取A,但不能修改A,其他事务只能再对A加上S锁,这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A进行任何修改。(允许并发读,但不允许修改。)


三、封锁协议:

    1、一级封锁协议:事务在修改数据A之前必须先对其加X锁,直到事务结束才释放。一级封锁协议可以解决丢失更新问题。(事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。)

    2、二级封锁协议:在一级封锁协议的基础上,加上事务T在读数据A之前必须先对其加S锁,读完后即可释放S锁。二级封锁协议可以解决读“脏”数据的问题。

    3、三级封锁协议:在一级封锁协议的基础上,加上事务T在读数据A之前必须先对其加S锁,直到事务结束时释放S锁。三级封锁协议除了防止丢失更新和读“脏”数据外,还进一步防止了不可重复读。


四、总结:

    最近了解到了乐观锁和悲观锁。知道它们和共享锁、排他锁一样,都能解决丢失更新、读脏数据、不可重复读的问题。但是对于乐观锁、悲观锁和共享锁、排他锁的区别还不甚了解。。。期望大牛前来指导。

 

       



0 0
原创粉丝点击