MySQL 事务 和 隔离级别

一、概念

        事务是一种机制,一个操作序列,包含了一组数据库操作命令,并且把所以的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。

是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元

使用于多用户同时操作的数据库系统的场景,如银行,保险公司整卷交易系统等等,

事务是通过事务的整体性以保证数据的一致性

总结:所谓事务,多个操作同时进行,要么全部成功,要么全部失败。这就是事务。

二 、事务特性

        ACID是指在可靠数据库管理系统中,事务应该具有四个特性:原子性,一致性,隔离性,持久性。

原子性:

        原子是自然界非常小的单位,我们可以看成它是不可再分的,同时它也是事务的一个特征,任何一个事务都可以想象成一个原子,表示其不可再分。只有事务中所有的数据库操作都执行成功,才算整个事务成功,事务中任何一个sql语句执行失败,已经执行成功的sql语句也必须撤销,数据库状态应该退回到执行事务前的状态。

        注意如果事务中的操作都是只读的,保持原子性比较简单,一发生错误,要么重试,要么返回错误代码即可,如果当前事务中存在插入或者更新操作,一旦失败,就会引起数据状态的变化,因此要保护系统并发用户访问受影响的部分数据。

一致性:
        指数据库中数据在事务操作前和操作后都必须满足业务规则约束,也就是A、B账户的总金额在转账前后必须一致,二者的总金额加起来不能多也不能少,如果有不一致,则必须是短暂的,且只有在事务提交前才会出现的。

再举一个例子,在表中有一个字段为姓名,是唯一的约束,即在表中姓名不能重复,如果有一个事务对姓名字段进行了修改,在事务提交后,表中的姓名变得非唯一了,这就破坏了事务一致性的要求,因为事务将数据库从一种状态变成了一种不一致的状态。

隔离性:

        一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

        隔离性还有其他称呼,比如并发控制、可串行化、锁等。通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。在转账的例子中,A向B转账时,C同时向A转账,如果同时进行,则A和B之间的一致行则不能满足,所以,当A和B执行事务的过程中,其他事务是不能访问或修改当前相关的数值。

持久性:

        一个事务一旦提交成功,它对数据库中数据的改变将是永久性的,接下来的其他操作或故障不应对其有任何影响。

       

三、MySQL事务隔离级别

读未提交(READ UNCOMMITTED):

        也叫未提交读,该隔离级别的事务可以看到其他事务中未提交的数据。该隔离级别因为可以读取到其他事务中未提交的数据,而未提交的数据可能会发⽣回滚, 因此我们把该级别读取到的数据称之为脏数据,把这个问题称之为脏读。


读已提交(READ COMMITTED):

        也叫提交读,该隔离级别的事务能读取到已经提交事务的数据, 因此它不会有脏读问题。但由于在事务的执⾏中可以读取到其他事务提交的结果,所以在不同时间 的相同 SQL 查询中,可能会得到不同的结果,这种现象叫做不可重复读。
 

可重复读(REPEATABLE READ):

        是  MySQL 的默认事务隔离级别,它能确保同⼀事务多次查询的 结果⼀致。但也会有新的问题,⽐如级别的事务正在执⾏时,另⼀个事务成功的插⼊了某条数 据,但因为它每次查询的结果都是⼀样的,所以会导致查询不到这条数据,⾃⼰重复插⼊时⼜失败 因为唯⼀约束的原因)。明明在事务中查询不到这条信息,但⾃⼰就是插⼊不进去,这就叫幻读 (Phantom Read)。

序列化(SERIALIZABLE):

        事务最高隔离级别,它会强制事务排序,使之不会发⽣冲突,从而解决了脏读、不可重复读和幻读问题,但因为执行效率低,所以真正使⽤的场景并不多。

        

 注意:  MySQL是支持给每个连接客户端单独设置事务的隔离级别的。
查询事务的隔离级别:     

 select @@global.tx_isolation, @@tx_isolation;


设置当前事务的隔离级别:

set session transaction isolation level 隔离级别

脏读:⼀个事务读取到了另⼀个事务修改的数据之后,后⼀个事务⼜进⾏了回滚操作,从而导致 第⼀个事务读取的数据是错误的。

演示:开启另一个客户端2

 

不可重复读:在⼀个事务中,两次查询同⼀条数据得到了不同的结果就是不可重复读。在⼀个事 务两次查询中间,另⼀个事务把这条数据修改了。

演示:

 

幻读:当同⼀查询在不同时间产⽣不同的结果,就是事务中的幻读问题。例如,⼀个 SELECT 被 执⾏了两次,但是第⼆次返回了第⼀次没有返回的⼀⾏,那么这⼀⾏就是⼀个“幻像”⾏。

演示:

 

        

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值