MySQL的事务特性和事务隔离级别

事务的概念

事务在计算机领域一般都默认称为——数据库事务( transaction),百度百科解释:它是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。


事务的性质分为ACID四种

  • 原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么全部不执行。 
  • 一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序 串行执行的结果相一致。  
  • 隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。  
  • 持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。 

举个栗子说明一下ACID的特性

业务场景:张三、李四、王五的银行里面各有1000元,此时张三、李四分别要给王五转500元。

串行步骤:

1、张三查询余额1000元,张三余额减500,余额为500;

2、王五查询余额1000元,王五余额加500,余额为1500;

3、李四查询余额1000元,李四余额减500,余额为500;

4、王五查询余额1500元,王五余额加500,余额为2000;

结果:张三500元、李四500元、王五2000元。

分析:步骤1、2属于同一事务A;步骤3、4属于同一事务B

  • 原子性:事务A,也就是张三转给王五500块钱,张三少了500,王五多了500,这两个操作是不可分割的,要么执行成功(张三500,王五1500),要么出现问题,全回滚到最初状态(张三1000,王五1000)

  • 一致性:假设张三、李四同时给王五转钱(不按照步骤1、2、3、4来),那么事务A和事务B属于并行执行的事务,最终的结果与按照步骤串行执行的结果一致,不会出现李四转王五500是在王五1000基础上加500的情况。

  • 隔离性:即使李四给王五转钱这个事务失败了,不会影响张三给李四转钱。这两个事务具有隔离性,互不干扰。

  • 持久性:事务一旦提交就会写入磁盘,提交后即使数据库宕掉,也不会影响事务结果。


事务的隔离级别

为什么要设置事务的隔离级别?并发操作!!!!

1、脏读:B事务在A事务执行过程中读取到了数据,并进行后续操作,之后A事务又回滚了,此时B事务读取到的数据属于脏读。

场景:张三、李四要给王五转钱,不过结果必须是:王五账户的最终余额是1600元。于是出现了下面这种情况。

解决方法:在事务A提交时,不允许其他事务读取其修改过的值!也就是不让李四读到1300元这个数字。

2、不可重复读:侧重点在于事务A读取到了一个结果,事务B修改了这个结果,本身这个事应该事务A去做,结果事务A再次读取的时候发现与第一次不一样了。

场景:王五给张三发短信,让他转过来1000块钱,张三收到短信但是没有回复,王五以为张三不知道,于是联系张三的姐姐张四,让张四用张三的账户转1000过来,殊不知实际张三已经打开APP准备转钱了,于是出现了下面这种情况。

3、幻读:这个情况容易和不可重复读混淆,其实幻读的侧重点在于增加一条数据或者删除一条数据,而不可重复读在于修改原始的数据,在不可重复读的例子上进行修改。

事务的4种隔离级别

事务的隔离级别存在的意义就是为了解决上述并发问题。

由低到高分别是:Read uncommitted、Read committed、Repeatablead、Serializable。事务隔离级别越高,在并发下会产生的问题就越少,但同时付出的性能消耗也将越大,因此很多时候必须在并发性和性能之间做一个权衡

下篇使用例子说明隔离级别的使用效果。

大家如果有什么疑问或者我这里有哪些说的不对的地方,欢迎指正~

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值