事务详解

一、事务概述
  二、事务的特性
  三、事务的隔离问题


一、事务概述
  事务很好理解,就是要做的事情,而这件事情是由一系列的动作完成,这些动作要么全部完成,要么全部不起作用。也就是说如果一个动作没有完成,其他所有的动作都将回到初始状态。这就是事务,在操作数据时经常会用到事务。

  可能说的比较抽象,如果大家还不理解,那么我就给大家举个生活中最常见的例子。比如说转账这件事情,它是由付款和收款两个动作组成,假如要转账100元,那么付款这个动作就要将账户上的钱减少100元,而收款这个动作就要将账户上的钱增加100元,如果付款这个动作失败,那么收款这个动作自然也就不能成功。

  这样说大家应该比较容易理解事务这个概念,当然事务中也有很多细节,接下来我就为大家一一解惑。


二、事务的特性
  一个事务都应该具有以下四个特性ACID(原子性、一致性、隔离性、持续性),下面就为大家一一解答。

1、原子性(Atomicity)
  事务包含的所有动作要么全部成功,要么全部失败回滚(回滚的意思是回到最初的状态,或滚到指定的状态)。比如 用户A 要转给 用户B 100元,那么 用户A 的账户 -100元,用户B 的账户 +100元,如果 用户A 的账户没有减少100元,那么 用户B 的账户也不会增加100元,这就是事务的原子性。

2、一致性(Consistency)
  指事务前后的数据必须保持一致。用户A 和 用户B 的钱一共加起来是1000元,那么不管A和B之间如何转账或转几次帐,他们俩的钱加起来还是1000元,总的数据是不能够改变的,前后要保存一致,这就是事务的一致性。

3、隔离性(Isolation)
  一个事务的执行,不受其他事务的干扰,即并发执行的事务之间互不干扰。多个事务同时对同一组数据进行处理时,如果将这些事务进行隔离,那就一个事务处理完下一个事务才能开始处理,也就是说在同一时间内只能有一个事务来处理数据。比如说 用户A 和 用户B 同时给 用户C 转账,这是两个事务(用户A 转给 用户C,用户B 转给 用户C),因为他们都对 用户C 的账户作处理,所以要将这两个事务隔离开。在事务处理的时候,必须一个事务处理完下一个事务才能开始处理,A先给C转,或者B先给C转,它们是不能同时进行的。


4、持续性(Durability)
  指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,即使数据库发生故障也不应该对其有任何影响。用户A 和 用户B 之间的转账操作成功后,用户A 和 用户B 的账户上的钱就会发生永久的改变。


三、事务的隔离问题
  在事务的并发操作中,也就是多个事务同时对同一组数据进行操作时,可能会出现脏读、不可重复读、幻读这三个问题,下面我们就一一来为大家讲解这三个问题。

1、脏读
  一个事务读到另一个事务没有提交的数据。事务A修改了一个数据,但未提交,事务B读到了事务A未提交的更新结果,事务B读到的就是脏数据。

事例: 老板要给程序员发工资,程序员的工资是3.6万/月。但是发工资时老板不小心按错了数字,按成3.9万/月,该钱已经打到程序员的户口,但是事务还没有提交,就在这时,程序员去查看自己这个月的工资,发现比往常多了3千元,以为涨工资了非常高兴。但是老板及时发现了不对,马上回滚差点就提交了的事务,将数字改成3.6万再提交。

分析: 实际程序员这个月的工资还是3.6万,但是程序员看到的是3.9万。他看到的是老板还没提交事务时的数据。这就是脏读,也就是看到了脏的数据。

2、不可重复读
  一个事务读到另一个事务修改后并提交的数据(update)。在同一个事务中,对于同一组数据读取到的结果不一致。比如,事务B 在 事务A 提交前读到的结果,和在 事务A 提交后读到的结果可能不同。不可重复读出现的原因就是由于事务并发修改记录而导致的。

事例: 程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他买单时(程序员事务开启),收费系统事先检测到他的卡里有3.6万,就在这个时候!!程序员的妻子要把钱全部转出充当家用,并提交。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了(第二次检测金额当然要等待妻子转出金额事务并提交完)。程序员就会很郁闷,明明卡里是有钱的…

分析: 在这个事例中,涉及到了两个事务(程序员事务和妻子事务),当程序员事务开启时,收费系统读取程序员卡里钱的操作还没完成,此时妻子这个事务就将卡里的钱进行了转账,即对数据进行了修改,导致收费系统两次读取到的数据不一样。出现了一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读,这是由于数据更新导致的,不能重复读取相同的数据。

事务的不可重复读
3、虚读(幻读)
  一个事务读到另一个事务新增加并提交的数据(insert)。在同一个事务中,对于同一组数据读取到的结果不一致。比如,事务A 新增了一条记录,事务B 在 事务A 提交前后各执行了一次查询操作,发现后一次比前一次多了一条记录。幻读出现的原因就是由于事务并发新增记录而导致的。

事例: 程序员某一天去消费,花了2千元,然后他的妻子去查看他今天的消费记录(妻子事务开启),看到确实是花了2千元,就在这个时候,程序员花了1万买了一部电脑,即新增INSERT了一条消费记录,并提交。当妻子打印程序员的消费记录清单时(妻子事务提交),发现有两条记录,共花了1.2万元,似乎出现了幻觉,这就是幻读。

分析: 在这个事例中,事务B读取了数据,接着另一个事务A插入了一条数据。在随后的查询中,事务B就会发现多了一条原本不存在的记录,就好像发生了幻觉一样,这是由于数据新增导致的。

事务的幻读
注: 如果大家对 不可重复读 和 幻读 还是不太理解,接下来我们就看一下它们之间的区别。

不可重复读和幻读的区别
  不可重复读的重点是修改数据,幻读的重点是新增或者删除记录。

  不可重复读,改变的是数据,数据记录总条数并没有发生改变;

  幻读,改变的是数据记录总条数,原来数据的值,没有发生改变,只是新增了记录条数。

疑问:
  大家可能会有这样的疑问,幻读不是因为第二次读到的结果和第一次读到的结果不一样而产生幻觉,所以叫幻读嘛?好像不可重复读也是这样的,那为什么不可重复读不叫幻读呢?那是因为大家可能忽略了一个细节,不可重复读改变的是同一条数据,而幻读改变的是数据的条数。第一次读到一条,第二次却读到了两条,好像产生了幻觉一样,所以叫幻读;而不可重复读是第一次读到这个数据的值和第二次读到这个数据的值不一样,也就是相同的数据不能重复读两次,否则会出错,所以它叫做不可重复读。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值