数据库的可靠性

一.并发控制与封锁

(一)事务
1.定义
事务是数据库系统中执行的一个工作单位,它是由用户定义的一组操作序列。一个事务可以是一组SQL语句、一条SQL语句或整个程序,一个应用程序可以包括多个事务。 DBMS的并发控制是以事务为基本单位进行的

2.特征

  • 原子性
    一个事务是一个不可分割的工作单位,事务在执行时,应该遵守“要么不做,要么全做”(Nothing or All)的原则,即不允许完成部分的事务。
  • 一致性
    事务对数据库的作用是数据库从一个一致状态转变到另一个一致状态。所谓数据库的一致状态是指数据库中的数据满足完整性约束。
  • 隔离性
    如果多个事务并发地执行,应像各个事务独立执行一样,一个事务的执行不能被其他事务干扰。 即一个事物内部的操作及使用的数据对并发的其他事物是隔离的。
  • 持久性
    持久性指一个事务一旦提交,它对数据库中数据的改变就应该是持久的,即使数据库因故障而受到破坏,DBMS也应该能够恢复。

(二)并发操作与数据的不一致性
1.丢失更新
当两个事务T1和T2读入同一数据,并发执行修改操作时,T2把T1或T1把T2的修改结果覆盖掉,造成了数据的丢失更新问题,导致数据的不一致。
2.污读
事务T1更新了数据R,事务T2读取了更新后的数据R,事务T1由于某种原因被撤销,修改无效,数据R恢复原值。事务T2得到的数据与数据库的内容不一致,这种情况称为“污读”。
3.不可重读
事务T1读取了数据R,事务T2读取并更新了数据R,当事务T1再读取数据R以进行核对时,得到的两次读取值不一致,这种情况称为“不可重读”。

(三) 封锁
封锁就是当一个事务在对某个数据对象进行操作之前,必须获得相应的锁,以保证数据操作的正确性和一致性
1.封锁类型

  • 排他型封锁
    排他型锁又称写封锁,简称为X封锁。原理为禁止并发操作。当事物T对某个数据对象R上X锁后,其他事务要等T解除X锁后,才能对R进行封锁。其他事务在T释放R的封锁之前不能对R进行操作。
  • 共享封锁
    共享封锁又称读封锁,简称为S锁。原理为允许其他用户对同一数据对象进行查询。但不能对该数据对象进行修改。当事务T对某个数据对象R上S锁后,其他事务只能对R加S锁而不能加X锁,直到T释放R上的S锁。

2.封锁协议

  • 一级封锁协议
    事务T在修改数据对象之前必须对其加X锁,直到事务结束。 一级封锁协议只有修改数据时才进行加锁,但是只是读取数据并不加锁,所以它不能防止“污读”和“不可重读”数据
  • 二级封锁协议
    在一级封锁协议的基础上,另外加上事务T在读取数据R之前必须先对其加S锁,读完后释放S锁。 当事务T对R上了X锁后,其他的事务不能对其再上S锁,只能等到T释放X锁。二级封锁协议在读取数据之后立即释放S锁,所以不能防止“不可重读”数据
  • 三级封锁协议
    在一级封锁协议的基础上,另外加上事务T在读取数据R之前必须先对其加S锁,读完后并不释放S锁,而直到事务T结束才释放。
二.数据库的恢复

原理:数据冗余
恢复系统应该提供两种类型的功能:一种是生成冗余数据,即对可能发生的故障做某些准备;另一种是冗余重建,即利用这些冗余数据恢复数据库。生成冗余数据最常用的技术是登记日志文件和数据转储,在实际应用中,这两种方法常常结合在一起使用。
登记日志文件必须遵循以下两条规则:

  • 至少要等到相应运行记录的撤销部分已经写入日志文件中以后,才允许该事务向物理数据库写入记录
  • 直到事务的所有运行记录的撤销和重做两部分已经写入日志文件中,才允许事务完成提交处理

猜你喜欢

转载自blog.csdn.net/qq_43406565/article/details/108132637
今日推荐