startup 干货数据库知识点

我理解的数据库事务

2015-03-28  本文已影响3424人  AQ王浩

一、最简单的例子来说明事务

“A账户向B账号汇钱”来说明事务

1、从A账号中把余额读出来。
2、对A账号做减法操作。
3、把结果写回A账号中。
4、从B账号中把余额读出来。
5、对B账号做加法操作。
6、把结果写回B账号中。

为了数据的一致性,这6件事,要么都成功做完,要么都不成功。而且这个操作的过程中。对A、B找好的其他访问必须锁死,所谓锁死就是要排除其他的读写操作,不然会有脏数据问题,这就是事务。

二、数据库事务特性

三、数据库的隔离级别

由于性能的考虑,许多数据库允许使用牺牲隔离属性来换取并发度,从而获取性能的提升。

隔离级别的降低可能导致读取到脏数据或事务执行异常

隔离级别与读写异常(不一致)的关系如下

LU DR NRR SLU PR
RU Y Y Y Y Y
RC N N Y Y Y
RR N N N N Y
S N N N N N

四、数据库的事务与线程相似的地方

五、用例子来说明事务隔离性

假设账户A有1000元,B有1000元,C有1000A

1、操作员u1执行一次转账事务m1
从A转移500元到B,再从A的余额中转移50%元平均分配到 A B C D E余额中

2、操作员u2执行一次转账事务m2
从B转移1000元到A

3、操作员u3执行一次转账事务m3
从A转移200元到B

4、操作员u4开户D

账户表为T_C,其包含字段为 账户名称cname 余额money

记录为{A,1000},{B,1000}

事务m1的操作包括

  读A,读B,   
  写A,写B,   
  提交AB,读A,   
  读C,写C,写C,   
  提交AC   

事务m2的操作包括

  读B,读A,   
  写B,写A,   
  提交AB   

事务m3的操作包括

    读A,读B,   
    写A,写B,   
    提交AB   

事务m4的操作包括

    写D,   
    提交D   

1.若未授权读取ReadUncommitted

m1读A,B,写了A但没写B
此时m2不可以写B,可以读取AB,但是B是脏读。
隔离级别使用了“排他写锁”。

2.若授权读取ReadCommitted

m1读A,B,写了A但没写B
此时m2不可以写B,可以读取A,不能读取B,因为B是脏读。
隔离级别使用了“排他写锁”。
m1读写了A,B,提交A``B,
m3提交了A``B 此时m1准备第二次A是允许的。
隔离级别使用了“瞬间共享读锁”。
(但由于第二次读产生了不可重复读的问题,事务1脱力了元自行,因为逻辑上看事务1中被插入了3,影响了A的余额50%的计算。)

3.若可重复读取RepeatableRead

m1读A,B,写了A
但没写B此时m2不可以写B,可以读取A,不能读取B,因为B是脏读。
隔离级别使用了“排他写锁”。
m1读写了A,B,提交A``B,
m4提交了D此时m3是能读不能写A并更新提交的。
此时m4是能读能能插入D的。隔离级别使用了“共享读锁”。
(和ReadCommitted比RepeatableRead区别对已经提交的事务可以进行读,但不能写,但是同一张表可以插入新的记录。)

4.序列化Serializable

任何事务都只能等前一事务完全执行完再执行。 但是失去了并发性。

转载,有修改,我只是个搬运工

参考

事务的ACID
分布式系统的事务处理
关于数据库事务、隔离级别、锁的理解与整理

上一篇 下一篇

猜你喜欢

热点阅读