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

数据库事务

时间:2019-07-24 20:55:22      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:ioi   mtu   完整   win   href   tail   jaf   mil   rac   

参考
一、定义
事务是一个抽象的概念;是数据库运行中的逻辑工作单元,单个逻辑工作单元所执行的一系列操作,要么都执行,要么都不执行。数据库事务是构成单一逻辑工作单元的操作集合。
定义解释备注:
1.数据库事务可以包含一个或多个数据库操作,但是这些操作构成一个逻辑上的整体。
2.构成逻辑整体的这些数据库操作,要么全部执行成功,要么全部不执行。
3.构成事务的所有操作,要么全都对数据库产生影响,要么全部不产生影响,即不管事务是否执行成功,数据库总能保持一致性状态。
4.已上即使在数据库出现故障以及并发事务存在的情况下仍然成立。
二、事务的特性(ACID)
1.原子性(Atomicity)
事务中的所有操作作为一个整体,像原子一样不可分割,要么全部成功,要么全部失败,不存在中间状态。
2.一致性(Consistency)
事务的一致性指的是在一个事务执行之前和执行之后,数据库都必须处于一致性状态。事务执行结果,必须使数据库从一个一致性状态到另外一个一致性状态。一致状态的含义是数据库中的数据应该满足完整性约束。
3.隔离性(Isolation)
并发执行的事务之间不会相互影响。
4.持久性(Durability)
已被提交的事务对数据库的修改应该永久保存在数据库中,
三、数据库常见的并发异常
1.脏写
脏写是指事务回滚了其他事务对数据项的已提交修改
2.脏读
脏读是指一个事务读取了另一个事务未提交的数据
3.丢失更新
丢失更新是指事务覆盖了其他事务对数据的已提交修改,导致这些修改好像丢失了一样
4.不可重复读
不可重复读是指一个事务对同一数据的读取结果前后不一致。脏读和不可重复读的区别在于:前者读取的是事务未提交的脏数据,后者读取的是事务已经提交的数据,只不过因为数据被其他事务修改过导致前后两次读取的结果不一样。
5.幻读
幻读是指事务读取某个范围的数据时,因为其他事务的操作导致前后两次读取的结果不一致。幻读和不可重复读的区别在于,不可重复读是针对确定的某一行数据而言,而幻读是针对不确定的多行数据。因此幻读通常出现在带有查询条件的范围查询中。
四、事务的隔离级别
事务具有隔离性,理论上来说事务之间的执行不应该相互产生影响,其对数据库的影响应该和它们串行执行时一样。然而完全的隔离性会导致系统并发性能很低,降低对资源的利用率,因而实际上对隔离性的要求会有所放宽,这也会一定程度上造成对数据库一致性要求的降低。
事务的隔离级别,从低到高依次为:
1.读未提交(Read uncommitted)
读未提交,就是一个事务可以读取另一个未提交事务的数据
2.读已提交(Read committed)
读提交,就是一个事务要等另一个事务提交后才能读取数据
3.可重复读(Repeatable read)
重复读,就是在开始读取数据(事务开启)时,不再允许修改操作。
4.串行化(Serializable)
序列化是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读和幻读。但是这种事务隔离级别效率低下,比较消耗数据库性能,一般不使用。
Mysql的默认隔离级别是可重复读,Oracle的默认隔离级别为读提交。
事务隔离级别
脏写
脏读
不可重复读
幻读
丢失更新
读未提交
 
可能
可能
可能
可能
读已提交
   
可能
可能
可能
可重复读
     
可能
 
串行化
         
所有事务隔离级别都不允许出现脏写,而串行化可以避免所有可能出现的并发异常,但是会极大的降低系统的并发处理能力。

数据库事务

标签:ioi   mtu   完整   win   href   tail   jaf   mil   rac   

原文地址:https://www.cnblogs.com/xiaobaixie/p/11240712.html

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