简介隔离层级

有点晚了,但是还是想写点东西,今天简单谈一下数据库中的隔离性,隔离性是交易的保证之一,表示交易与交易之间不互相干扰,好像同时间就只有自己的交易存在一样,隔离性保证的基本方式是在资料库层面,对资料库或相关栏位锁定,在同一时间内只允许一个交易进行更新或读取。

先来看看没有对资料库进行锁定下,可能发生的问题:

更新遗失(lost update)
基本上就是指某个交易对栏位进行更新的资讯,因另一个交易的介入而遗失。

例如,两个以上交易在进行同一栏位的更新时,若没有对栏位进行锁定,若交易A进行COMMIT,交易B因故ROLLBACK,则交易A所作的更新就会发生遗失的问题:

交易A更新栏位1
交易B更新栏位1
交易A COMMIT
交易B ROLLBACK
另一种可能的情况是,如果交易A在交易B前后进行更新与COMMIT,则交易B所作的更新将会遗失,又称为二次更新遗失(second lost update),例如:

交易A更新栏位1
交易B更新栏位1
交易B COMMIT
交易A COMMIT
在以上的情况,交易B所进行的更新将会遗失。

脏读(dirty read)
两个交易同时进行,其中一个交易更新资料,另一个交易读取了尚未COMMIT的资料,就有可能发生脏读问题。例如:

交易A更新栏位1
交易B读取栏位1
交易A ROLLBACK
交易B COMMIT
在以上的情况下,交易B读取的是不正确的资料。

无法重复的读取(unrepeatable read)
某个交易两次读取同一栏位的资料并不一致,例如,如果交易A在交易B前后进行资料的读取,则会得到不同的结果。

交易A读取栏位1
交易B更新栏位1
交易B COMMIT
交易A读取栏位1
在以上的情况,交易A读取两次栏位1,但却得到不同的结果。

幻读(phantom read)
如果交易A进行两次查询,在两次查询之中有个交易B插入一笔新资料或删除一笔新资料,第二次查询时得到的资料多了第一次查询时所没有的笔数,或者少了一笔。

交易A进行查询得到五笔资料
交易B插入一笔资料
交易B COMMIT
交易A进行查询得到六笔资料

隔离交易的基本方式是锁定资料库,但完全的锁定资料库实务上并不会这么作,因为完全的锁定资料库将导致严重的效能问题,因此实务上会根据资料读写更新的频繁性,设定不同的交易隔离层级(transaction isolation level):

read uncommited
简而言之,某个交易可以读取另一个交易已更新但尚未commit的资料,所以允许dirty read,但不允许lost update,也就是允许交易B读取交易A更新尚未COMMIT的资料,但在交易A进行COMMIT前,不允许其它交易再写入(也就是写入锁定)。

这个隔离层级读取错误资料的机率太高,一般不会采用这种隔离层级。

读取的交易不会阻止其它的交易,一个未COMMIT的交易会阻止其它写入的交易。
read commited
比read uncommited严格一些,简而言之,某个交易仅可读取另一个交易已commit的资料,所以允许unrepeatable read,但不允许dirty read,一笔交易正在读取资料时,允许另一笔交易进行资料写入,但不允许已经dirty的资料被读取或写入(shared read lock, exclusive write lock)。

读取的交易不会阻止其它的交易,一个未COMMIT的交易会阻止其它所有的交易。
repeatable read
比read commited严格,在一个交易己读取的资料,不允许其它交易进行资料写入,不允许unrepeated read,但phantom read还是可能发生。

读取的交易不会阻止其它读取的交易,但会阻止其它写入的交易,而写入的交易会阻止所有其它的交易。

serializable
最严格的隔离层级,同一笔资料一次只能有一个交易,无法让交易并行处理。

read uncommited出错的机率太大,大部份的应用程式会选用read commited或repeatable read的隔离层级,而serializable执行完全的锁定,严重伤害系统效能。

真正的锁定系统是在资料库系统上实作的,依各家厂商而有所不同,必须参考厂商的说明书,了解不同的隔离层级对应用程式的效能与扩展性有何影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值