数据库事物基础知识

来源:互联网 发布:保卫萝卜安卓数据同步 编辑:程序博客网 时间:2024/06/05 15:54

一.数据库并发的问题

一个数据库可能拥有很多个访问的客户端,这些客户端都可用并发的方式访问数据库。数据库中的相同数据可能同时被多个事物访问,如果没有采取必要的隔离措施,就会导致各种并发的问题,破坏数据的完整性。这些问题可以归类我5类,包括3类数据库读问题(脏读、不可重复读和幻象读)以及2类数据库更新问题(第一类丢失更新和第二类丢失更新),下面我们看看这些引发问题的场景。

(1)脏读(dirty read)

A事务读取B事务尚未提交的更数据,并在这个数据的基础上操作。如果恰好B事物回滚,那么A事务事物读到的数据根本是不被承认的。

(2)不可重复读(unreatable read)

不可重读是指A事务读取了B事务已经提交的更新数据。假设A在取款事务的过程中,B往改账号转账100元,A两次读取改账户的余额发生不一致。

(3) 幻象读(phantom read)

A事务读取了B事务提交的新增数据,这是A事务将出现幻象读的问题。幻象读一般发生在计算统计数据的事务中,举一个例子,假设银行系统在同一个事务中,两次统计存款账号的总金额,在两次统计的过程中,刚好新增了一个存款的账户,并存入100元,这是,两次统计的总金额将不一致!
如果新增的数据刚好满足事务查询的条件,这个新的数据就进入事务的新视野,因而产生了两个统计不一样的情况。

不可重复读跟幻象读的比较:幻象读跟不可重复读是两个比较容易混淆的概念,前者是指读到了其他已经提交事务的新数据,而后者是指已经提交事务更好数据(更改或删除),为了避免这两种情况,采取的对策是不同的,为了防止读取到更改的数据,只需要对操作的数据添加行级锁,阻止数据操作中的数据发生变化,而防止读取到新增数据,则往往需要添加表级锁——将整个表锁定,防止新增数据(Oracle使用多版本数据的方式实现)

(4)第一类丢失更新

A事务撤销时,把已经提的B交事务的更新数据覆盖了。这种错误可能造成很严重的问题。

(5)第二类丢失问题

A事务覆盖B事务已经提交的数据,造成B事务所操作丢失