Mysql中InnoDB事务

发布于:2024-04-24 ⋅ 阅读:(20) ⋅ 点赞:(0)
什么是事务

事务说白了就是,可以是【一组操作】要么全部成功,要么全部失败,目的就是为了【保证数据最终的一致性】

举个例子:我给你发支付宝转了6块红包。那自然我的支付宝余额会扣减6块,你的支付宝余额会增加8886。而事务就是保证 我的余额扣减跟你的余额增添是同时成功或者同时失败的

事务的四大特性(ACID)
  • 原子性(automicity):当前事务的操作要么同时成功,要么同时失败。
  • 一致性(Consistency):是使用事务的目的
  • 隔离性(Isolation): 在事务「并发」执行时,他们内部的操作不能互相干扰。如果多个事务可以同时操作一个数据,那么就会产生脏读、重复读、幻读的问题。有四种隔离级别 :read uncommit(读未提交)、read commit (读已提交),repeatable read(可重复复读)、serializable (串行)
  • 持久性(Durability):说白了就是,会将数据持久化在硬盘上。
名词解释:

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

不可重复读(Non-repeatable read):在一个事务的两次査询之中数据不一致,这可能是两次査询过程中间插入了一个事务更新的原有的数据。
幻读(Phantom Read):在一个事务的两次査询中数据笔数不一致,例如有一个事务査询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。

隔离性的四种级别:
  • 读未提交:我去买衣服,衣服666元,我转了钱,给老板看了,老板说“收到了”。然后我就出门,出门我就撤回刚才的666元,拿着衣服就走。等老板再看时666已经没有了(说白了就是:事务B读取到了事务A还没提交的数据)
  • 读已提交 :我拿着刚发的工资去消费,系统读取到卡里确实有666块,而同时我的会员自动要续费,把我的666元转走了,并在我消费前提交了事务,所以当我支付时,提示我没有钱了,但是卡里却有钱。
  • 重复读:当我拿着工资卡去消费时进行修改,也就是我的自动续费会员不能在此时转账。一旦系统开始读取工资卡信息(即事务开始),自动续费的会员就不可能对666块进行修改。
  • 串行化:最高的事务隔离级别,代价花费最高,性能很低,很少使用,在此级别下,事务顺序执行,避免上述产生的情况。