事务特性和并发带来的问题

1、什么是事务
事务是并发控制的单位,一系列操作组成的工作单元,该工作单元内的操作是不可分割的,也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。
事务的结束有两种,当事务中的所以步骤全部成功执行时,事务提交。如果其中一个步骤失败,将发生回滚操作,撤消撤消之前到事务开始时的所以操作。
2、事务的 ACID
事务具有四个特征:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持续性(Durability)。这四个特性简称为 ACID 特性。
1)原子性(Atomicity)
事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
2) 一致性(Consistency)
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。假如数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不一致。
3)隔离性(Isolation)
一个事务的执行不能其它事务干扰。一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
4) 持续性(Durability)
持续性也称永久性,是指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
在平常的项目开发里数据库操作一般都是并发执行的,即有多个事务并发执行,数据库事务并发带来的问题有:

1、丢失更新:两个事务同时更新一行数据,最后一个事务的更新会覆盖掉第一个事务的更新,从而导致第一个事务更新的数据丢失,这是由于没有加锁造成的;

第一类丢失更新
时间片消费事务A充值事务B
T1开始事务
T2开始事务
T3查询账户余额500元
T4查询余额为500元
T5充值200元,更改余额为700元
T6提交事务
T7消费100元把余额改为400元
T8撤销事务
T9余额恢复为500元
消费事务A在事务撤销时,将充值事务B已经充值的200元给弄丢失了。 第二类丢失更新
时间片消费事务A充值事务B
T1开始事务
T2开始事务
T3查询账户余额500元
T4查询余额为500元
T5消费100元,更改余额为400元
T6提交事务
T7余额为400元充值200元,更改余额为700元
T8提交事务
T9余额为700元
消费事务A在消费100元后更新数据库,而充值事务B给账户充值200元更改余额为700元,将消费的100元给弄丢失了。

2、脏读:一个事务看到了另一个事务未提交的更新数据;当事务读取尚未提交的数据时,就会发生这种情况。

例如事务A正在访问数据,并且对数据进行了修改,更改了一行数据,这种修改还没有提交到数据库中,而事务B在事务A提交更新之前读取了已更新的行,然后使用了这个数据。
如果事务A回滚该更新,则事务B使用的这个数据由于还没有提交,就会被认为是不曾存在的数据,即为脏数据,根据脏数据所做的操作可能是不正确的。

3、 不可重复读:在同一事务中,两次读取同一数据,得到内容不同,也就是有其他事务更改了这些数据;

例如事务A查询一条记录后,事务B更新了事务A查询的记录,并提交了事务,那事务A再次查询上次的记录时,对同一数据查询了两次,得到的结果不同,这称为不可重复读。

4、幻读:一个事务在执行过程中读取到了另一个事务已提交的插入数据;即在第一个事务开始时读取到一批数据,但此后另一个事务又插入了新数据并提交,此时第一个事务又读取这批数据但发现多了一条,即好像发生幻觉一样。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值