对事务的理解

一、基本概念

事务:为了实现某个功能而组合在一起的一组SQL语句,这组SQL语句要么全执行,要么全不执行

例:张三要给李四转100块钱,那么如果转钱成功的话,张三的账户会少100,而李四的账户会多100;否则张三和李四的账户余额仍保持不变。

二、特性

事务有四大特性(简称为ACID特性):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)


原子性:事务中的这组SQL语句要么全执行,要么全不执行【基本概念】


一致性:该事务提交后要使数据库从一个一致性状态变成另一个一致性状态。还是上边提到的转账的例子。假如执行该事务前张三和李四的余额分别为1000,900。那么成功执行张三向李四转账100这个事务后,张三和李四的余额分别变为900,1000【保证了数据库的一致性】。但是如果执行完该事务之后张三的余额变成了900,而李四的余额还是900,说明给李四账户加100的SQL语句没有执行成功,此时数据库就处于不一致状态。而要保证数据库的一致性,该事务的所有SQL语句都要成功执行,说明一致性跟原子性是分不开的。【简单来说就是,事务提交前后,数据的总额一致】


隔离性:各事务的执行互相没有干扰。


持久性:一个事务提交之后对数据库的修改是持久的。

三、隔离级别

四个隔离级别:读未提交、读已提交、可重复读、可串行化


读未提交:顾名思义,就是一个事务可以读取另一个还未提交事务的数据。可能会导致脏读

脏读:事务A正在访问一个数据,并且对这个数据做了修改,但是这种修改还没有提交到数据库中。此时事务B访问并使用了此数据。由于对该数据的修改还没有提交,所以我们称此时B读的数据为脏数据。【简单来说就是,事务B读取了事务A还未提交的数据】

例:1.Mary的原工资为1000, 财务人员将Mary的工资改为了8000(但未提交事务)

2.Mary读取自己的工资 ,发现自己的工资变为了8000,欢天喜地!

3.而财务发现操作有误,回滚了事务,Mary的工资又变为了1000

像这样,Mary读取的工资数8000就是一个脏数据。

分析:虽然Mary看到自己的工资是8000,但实际Mary的工资还是1000。由于他看到的是事务还没提交时的数据,所以这种数据就是脏数据-->脏读

解决脏读:读已提交


读已提交:一个事务要等待另一个事务提交后才能读取数据。可能会导致不可重复读

不可重复读:在一个事务内,多次读同一数据。但是在这个事务还没执行结束时,另一个事务也访问并修改了此数据。那么在第一个事务的两次读数据之间,由于第二个事务的修改,可能导致第一个事务两次读的数据不一样。这种发生了 在一个事务内 连续两次读到的数据不一样的情况称为不可重复读。【简单来说就是,同一个事务内,两次读的数据内容不一样】

例:1.在事务1中,Mary 读取了自己的工资为1000,操作并没有完成

2.在事务2中,这时财务人员修改了Mary的工资为2000,并提交了事务.

3.在事务1中,Mary 再次读取自己的工资时,工资变为了2000

分析:在事务1第一次读完数据之后,此时由于事务2对数据进行了更新操作,而读事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读。但是由于事务1前后两次查询的结果不一样,这种情况就是不可重复读

解决不可重复读:可重复读


可重复读:一旦事务开启,当该事务第一次读取数据之后,此时即使有其它事务对该数据做了修改,在该事务第二次读取数据的时候仍然可以保证读到的数据跟第一次一样。 由于可重复读只能保证不允许其他事务的update操作,但是没有保证不允许其他事务的insert操作,所以可能会导致幻读。

幻读:一个事务先后读取一个范围的记录,但两次读到的记录数不一样,称为幻读。比如新增或删除了某些记录导致该范围的记录数发生改变。【简单来说就是,同一个事务内,两次读到的记录数不一样,要么多了,要么少了】

例:目前工资为1000的员工有10人。

1.事务1,读取所有工资为1000的员工。

2.这时事务2向employee表插入了一条员工记录,工资也为1000

3.事务1再次读取所有工资为1000的员工 共读取到了11条记录【事务1两次读到的记录数不一样】

解决幻读:可串行化


可串行化:事务串行化顺序执行,可避免脏读、不可重复读,和幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。


注:MySQL默认隔离级别为可重复读

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值