事物隔离(一)


本文对什么是事物隔离,以及为什么会有事物隔离力争做一个详细的阐述,由于自身水平有限且是第一篇博文,请读者不吝指教。

 

这里我们先讨论一下为什么需要事物隔离,简单的讲就是当多个事物同时读写一个数据的时候,会出现一些事与愿违的结果,看下图

 数字1,2,3,4代表执行顺序,这里就会有一个问题,当事物TxA提交的时候原本打算对data进行的修改被TxB事物给回滚掉(TxA并没有做错什么)。这就是事物并发的环境下有可能出现的问题之一,那么数据库设置事物隔离级别就是为了防止这种状况的发生。

 

并发事物可能会出现:

  1. 更新丢失(第一张图就是)

            如果两个事物都更新一条数据,其中第二个事物异常终止就会发生更新丢失,这发生在没有实现锁的系统中。(几乎所有的数据库都不能允许更新丢失)

  2. 脏读取

            如果一个事物读取另一个还没有提交的事物进行改变,就会发生脏读取,这很危险,比方在一个同一个银行账号,A用户正在存钱,B用户在取钱,当A更新了数据由于某种原因事物未提交成功(突然停电),而就在这个时候B已经查询到A存钱过后的数字(银行亏了)。

  3. 不可重复读

            如果 一个事物读取一个行两次,在这两次之间有其他的事物更改了这行数据使得两次读取不同的状态,就会发生不可重复读取

  4. 幻读

     

            发生在一个事物执行一个查询两次,并且第二个结果集包含第一个结果集中不可见的行,或者包括已删除的行时,这种现象叫做幻读。这种情况通常是由另一个事物在两次查询执行之间插入或删除行造成的。

上述就是多并发事物环境下有可能出现的问题,为了解决这些问题ANSI SQL定义了一套事物隔离级别分别是:

  1. 允许赃读但不允许丢失更新的读取未提交(read uncommitted)
  2. 允许不可重复读取但不允许赃读的读取提交(read committed)
  3. 不允许不可重复读也不允许赃读,但允许幻读发生的可重复读(repeatable read)
  4. 可序列化(serializable)提供最严格的事物隔离,这个隔离级别模拟连续的事物执行,从而避免幻读的发生

这些隔离性级别只不过是ANSI SQL的标准,并不是每一个数据库都实现了所有的隔离性级别,MySQL支持的隔离性级别好像比较多,下一篇文章结合JDBC代码与MySQL介绍隔离性级别在编码中的使用。


本文对什么是事物隔离,以及为什么会有事物隔离力争做一个详细的阐述,由于自身水平有限且是第一篇博文,请读者不吝指教。   这里我们先讨论一下为什么需要事物隔离,简单的讲就是当多个事物同时读写一个数据的时候,会出现一些事与愿违的结果,看下图

 数字1,2,3,4代表执行顺序,这里就会有一个问题,当事物TxA提交的时候原本打算对data进行的修改被TxB事物给回滚掉(TxA并没有做错什么)。这就是事物并发的环境下有可能出现的问题之一,那么数据库设置事物隔离级别就是为了防止这种状况的发生。   并发事物可能会出现:
  1. 更新丢失(第一张图就是)

            如果两个事物都更新一条数据,其中第二个事物异常终止就会发生更新丢失,这发生在没有实现锁的系统中。(几乎所有的数据库都不能允许更新丢失)

  2. 脏读取

            如果一个事物读取另一个还没有提交的事物进行改变,就会发生脏读取,这很危险,比方在一个同一个银行账号,A用户正在存钱,B用户在取钱,当A更新了数据由于某种原因事物未提交成功(突然停电),而就在这个时候B已经查询到A存钱过后的数字(银行亏了)。

  3. 不可重复读

            如果 一个事物读取一个行两次,在这两次之间有其他的事物更改了这行数据使得两次读取不同的状态,就会发生不可重复读取

  4. 幻读

     

            发生在一个事物执行一个查询两次,并且第二个结果集包含第一个结果集中不可见的行,或者包括已删除的行时,这种现象叫做幻读。这种情况通常是由另一个事物在两次查询执行之间插入或删除行造成的。

猜你喜欢

转载自walnut1014.iteye.com/blog/1833979