MySQL事务

在MySQL中,我们常用的事务具备ACID(事务管理)四点

一、原子性(Atomicity)

原子性就是指整个事务中的操作,要么全部成功commit,要么全部失败rollback。不能只执行当中的一段,这也就是事务的原子性。

举个栗子

小明需要将花呗里的100额度提取到零钱中进行消费。这就是一个事务,①先判断花呗额度是否有100②花呗额度-100③零钱+100。

这样就可以知道,只要当中任意一步骤报错,都应该进行回滚,反之,如果正常运行,则应该最后提交事务。

二、持久性(Consistency)

数据库需要从一个一致的状态到另一个一致的状态。上述栗子中,我们没有操作成功,需要将花呗额度返回为最初的100,因为事务没有提交,数据没有发生改变,也就是一致性。

三、隔离性(Isolation)

因为一个事务对于其他事务而言应该是不可见的。也是上述栗子而言,我们在进行将额度提取到银行卡时,此时有另一个线程正在访问用户余额。这样就需要是不可见的,这里也就需要我们提到MySQL中的事务的隔离级别。

以下为并发场景,常出现的事务问题

①场景一:用户A正在执行查询数据的事务,用户B正在执行修改数据的事务,用户A再次进行查询时,发现用户A并没有操作数据,数据已经被修改了,并骂骂咧咧的走了。这就是脏读的问题。

②场景二:用户A正在执行查询数据的事务,用户B正在执行修改数据的事务,并且修改完成就commit了事务,这时用户A又查询数据,发现数据又被修改了,又骂骂咧咧的走了。这就是出现了不可重复读的问题。

③场景三:用户A正在新增一条数据,用户B也正在新增同一条数据,并提交了事务,这时候事务A提交事务,发现不行,发现里面已经有了这一条数据了,还是骂骂咧咧的走了。这就出现了幻读的问题。

以上三个并发场景就是我们在设置对应不同的隔离级别时,可能会出现的问题,所以设置隔离级别是很重要的。

这里的串行化就是将MySQL的谁先提交的事务,需要该事务提交或者回滚后才会执行下一个事务。 

设置这样的隔离级别就可以解决不同的问题,在MySQL中默认的是设置为Read Commited这样的隔离级别。我们需要考虑实际情况,因为对于不同的隔离级别,性能的消耗也是很重要的,虽然串行化的隔离级别是最高的,但是同时性能的消耗也是最大的。

四、持久性(Duration) 

一旦事务提交,你的数据库就会永久存储,因为MySQL是内存存储是在磁盘上的,所以即使系统奔溃的,数据库的数据是持久化的存在的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈Demo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值