MySql的事务是什么?什么是脏读?幻读?不可重复读?

一、什么是事务?

        事务(Transaction),就是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行。它主要用于处理操作量大,复杂度高的数据,例如,在一个学生管理系统中,如果要删除一个学生,除了要删除学生的基本信息,还要删除与这个学生相关的所有信息,如成绩,获奖情况等等,实现这些操作的SQL语句就构成了一个事务。

二、事务的特性:

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

原子性(Atomicity):一个事务中的操作,要么全部完成,事务进行提交,执行commit操作,要么全部失败,事务进行回滚,回到事务开始执行前的状态,执行rollback操作。

一致性(Consistency):事务开始之前和事务结束之后,数据的完整性不会遭到破坏。

隔离性(Isolation):数据库是允许多个事务同时对数据进行读写和修改,但是每个事务在执行时是互不干扰的,一个事务在执行过程中其任一时刻的数据是不会被其他事务所看到和操作的。事务的隔离也分为四个级别,分别是读未提交、不可重复读(读已提交)、可重复读和串行化,每个隔离级别也有其相对于的问题,于下文给各位看官讲解,目前Mysql默认的事务隔离级别是可重复读。

持久性(Durability):经事务处理过的数据,将永久的被保存,即使系统出现故障也不会丢失,不会发生回滚。

三、事务的隔离级别及所对应的问题

1、读未提交:所有事务都可以看到其他还未提交事务的数据,例如你正在对学生信息进行修改,还没有提交,对其他事务也是可见的,这类隔离级别也最容易出现脏读、不可重复读和幻读的问题,因此该隔离级别极少用于实际应用。

2、不可重复读(读已提交):一个事务从开始到提交这一过程,其对数据做的任何修改其他事务均不可见,此隔离级别也是大多数数据库系统默认的隔离级别。这类隔离级别容易出现不可重复读和幻读问题。

3、可重复读:一个事务在读取同样数据的时候,得到属于这一数据的结果,解决了脏读的问题,但是却会造成幻读的问题,既同一事务多次查询返回不同的结果。

4、串行化:最高的隔离级别,解决了幻读的问题,但是却造成了大量的锁的竞争和超时现象,实际应用中也很少用到这个隔离级别。虽然花费代价高,不过又是最可靠的事务隔离级别。

四、什么是脏读、幻读、不可重复读?

脏读(Dirty Read)

        某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。

幻读(Phantom Read):

        在一个事务的两次查询中数据数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。

不可重复读(Non-repeatable Read):

        在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。

        世间没有完美的事物,任何事物都具有两面性,代码亦然,在追求高效率的同时必然会产生一些无法预料的问题,所以盆友们要理性选择,不要一味追求高效率,也不能就此躺平,只要求平稳度,我们要充分发挥我们聪明的大脑,找到最适合我们需求的写法,力求我们的代码美观又实用,大家冲冲冲鸭!!!!最后最后,如果盆友们觉得我分析的还可,就点点右下角的大拇指(注意是向上的大拇指哈),如果文章中有什么错误,也请盆友们多多提出来哈。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值