码迷,mamicode.com
首页 > 数据库 > 详细

数据库事务

时间:2016-02-27 00:55:39      阅读:264      评论:0      收藏:0      [点我收藏+]

标签:

先看下生活中的一个场景:小李给小王转了100块钱,那么这个过程中,银行会先把小李账户减去100块,然后往小王账上加100块。如果没有异常情况,这个过程好像是没问题。那么想象下如果银行在给小李账户减了100,突然系统出问题了,小王的账户没来得及加上100。这不是有问题吗,该怎么解决呢?这就引出了下面要讨论的问题,数据库事务。

 

数据库事务四大特性:

原子性(Atomicity): 一个事务里的所有操作,要么全部执行,要么全部失败。比如上面扣账和入账的动作,必须成功或失败都保持一致,否则小王和小李都会有意见的。

一致性(Consistemcy):事务前后数据都保持着完整性。比如转账前小李加上小王账上是100,转账后还是100。

隔离性(Isolation):事务并发时是相互隔离的,一个事务不会影响另一个事务的执行。这个通过设置数据库隔离级别可以达到不同结果。

持久性(Durability):事务完成提交后,将持久化到数据库中,并不会被回滚。

 

再来想想并发引起的问题。

更新丢失:两个事务同时对一行数据进行更新,但是第二个事务更新后没有提交,导致该行数据更新都失效。

脏读:事务A对一行数据进行更新但未提交,接着事务B读取该行数据,但是事务A回滚了该操作,也就是事务B读取的数据是错误的数据。

不可重复读:事务A连续两次读取了同一行数据,但是在两次读取的时间间隔事务B对该行数据进行了更新,导致两次读取的该行记录不相同。

幻想读:事务A有一个带where条件的查询语句,执行后返回一个结果集,这时事务B插入了一条记录刚好满足where条件,事务A再次执行该查询语句时会把事务B插入的数据查询出来。该记录就是幻想数据。

 

该如何解决这个问题呢。

通过设置数据库隔离级别可解决这些问题,数据库一共有4个隔离级别,如下图。

 

 

  更新丢失 脏读 不可重复读 幻想读
READ UNCOMMITTED      
READ COMMITTED    
REPEATABLEREAD  
SERIALIZABLE

 

 

 

 

 

从上图可看出各种隔离级别与问题的对应解决情况,而ORACLE数据库只支持READ COMMITTED和SERIALIABLE两种。

 READ UNCOMMITTED是最不安全的,但是最快,SERIALIZABLE最安全,但是最慢。呵呵,能量守恒,想要做到安全,当然要多费点功夫。

 

那么隔离级别是怎么实现的呢。

DBMS(数据库管理系统)是通过锁机制来实现各种隔离级别的。

 

更新履历:

2016.02.26   新建

 

数据库事务

标签:

原文地址:http://www.cnblogs.com/luoyebojue/p/5222081.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!