数据库事务
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库事务相关的知识,希望对你有一定的参考价值。
先看下生活中的一个场景:小李给小王转了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 新建
以上是关于数据库事务的主要内容,如果未能解决你的问题,请参考以下文章