事物属性,以及锁

事物定义:访问并可能更新数据库的执行单元,有4个属性,语句多事begin transaction  end transaction

1,事物的属性

1.1 原子性:事物的所有操作要么全部执行,要么全部不执行,这个主要是通过日志来实现,日志中会记录我们修改的事物标识符,修改的数据项标识符以及数据项的旧值和新值,只有将这些写入了日志后,数据库才会进行事物执行,以确保出错时候可以回滚

1.2 隔离性:多个用户并发访问数据库的时候,隔离性保证了事物像串行一样执行(当然这是理论上的)。数据库可以设置隔离性的级别。级别越高,并发处理性能越差。隔离级别是通过并发控制机制来保证,主要用了锁,下面会讲到锁

1.2.1 可串行化,隔离级别最高,顾明思议一个事物执行某个数据库期间另一个事物不可以执行

1.2.2 可重复读:只允许事物读取另一个事物已经提交的数据。而且一个事物两次读取一个数据项期间,不允许其他事物更新该数据。

1.2.3 已提交读: 只允许事物读取另一个事物已提交的数据,但不要可重复读,比如两个事物读取同一个数据项期间,另一个事物更新了该数据并提交

1.2.4 未提交读: 允许读取未提交数据。这是最低的隔离等级

以前所有的事物都不允许脏写,一个事物对一个数据项进行写操作,但是还没有提交,不允许另一个事物进行写操作。

1.3 持久性:数据库的改变对数据库的影响必须是持久的

1.4 一致性:事物在对数据库操作完后,数据库的前后是要保持一致性的,这主要是对程序员的职责,而数据库并不能提供

2 锁

确保隔离性的方法之一是要求对数据项以互斥的方法进行。

数据库有时候不光是给单个数据项加锁,某些情况下我要把多个数据项聚为一组,把他们作为一个同步单元。比如事物T对某个数据库进行操作,此时不能一个个去给数据库下面的每个数据项加锁,最好数据库可以提供一种机制,即对数据库直接上锁。数据库为此提供了多粒度机制。多粒度可以概括为树结构层次

树中每个结点可以单独加锁,此时可以使用共享锁,排它锁。当事物对一个结点加锁,该事物也隐视的给这个结点的后代加同种类型的锁,没有必要给后代显示加锁。一个事物Ti给Fa加锁后,另一个事物Tj要对Ra进行操作,但是此时Ra并没有显示加锁。另一种情况,事物Tk要对Db加锁,可是此时Ti却对Fa持有锁了那怎么办,因为每次给某个数据项结点加锁的时候,都要从根结点进行遍历,在遍历过程中可以给遍历过的结点加上锁,这时候引入了新的锁,意向锁类型,和之前的两用锁类型,一起组成了共享型意向锁,排他型意向锁,共享排它型意向锁。这五种锁一起组成了多粒度封锁协议。当给某一个结点加锁的时候,就从根结点遍历到此结点看有没有不相容的锁。


共享锁和排它锁是仅仅针对一个数据项而言,其他三种锁是在遍历中给遍历的结点加载不同的锁的。

共享型意向锁:在树的较低层进行显示封锁,但是只能加共享锁。

排他型意向锁:在树的较低层进行显示封锁,可以加排它锁或共享锁。比如在结点Fb加这个锁,那么rb1可以是共享或者排它锁

共享排它意向锁:

举例子

假设事物T21读文件Fa记录Ra2,那么T21就要给数据库,区域a1,文件Fa加is锁,最后给ra2加s锁

假设事物T22要修改Fa记录ra9,那么T22需要给数据库,区域A1以及文件Fa加ix锁,最后给记录ra9加x锁

假设事物T23要读取文件Fa所有记录,那么T23需要给数据库和区域A1加IS锁,最后给Fa加s锁

假设事物T24要对整个数据库进行读取,那么直接给数据库加s锁

事物要对一个数据项加锁。需要按照多粒度封锁协议进行,这个协议里面有一点是事物对某个结点q加锁,必须对q的父节点具有某种相容锁才行


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值