浅入浅出MySQL事务等特性

把数据库生产账号放在新人文档上,谁之过?

7 年前 Reddit 论坛出现了这么一篇帖子,大学毕业后第一天上班的新手程序员,运行了一份数据库测试脚本,直接把整个生产数据库删掉,CTO 让他有多远滚多远。

在这里插入图片描述

我是南哥,相信对你通关面试、拿下Offer有所帮助。

敲黑板:本文总结了MySQL事务、主从复制等常见的面试题!

⭐⭐⭐收录在《Java学习/进阶/面试指南》:https://github/JavaSouth

1. MySQL事务

1.1 事务的特性

MySQL事务有四大特性。

  1. 原子性(atomicity):一个事务必须是一个不可分割的最小工作单元,整个事务所有的操作,要么成功提交,要么都失败回滚。
  2. 一致性(consistency):事务总是从一个一致性状态转换为另一个一致性状态。
  3. 隔离性(isolation):一个事务所作出的修改在还没有提交之前,对其他事务来说是不可见的。
  4. 持久性(durability):如果事务进行提交后,其所做的修改必须是永久性的,不会因为系统崩溃而丢失修改。

1.2 事务隔离级别

SQL标准定义了四种隔离级别,较低级别的隔离通常来说系统开销更低些。

  1. READ UNCOMMITTED(未提交读):事务的修改,即使没有提交,对其他事务来说也是可见的。这是最低级别的事务隔离,企业生产中很少使用到。
  2. READ COMMITTED(提交读):事务在未提交前,所做的修改对其他事务是不可见的。这个隔离级别也称为不可重复读,主要是因为两次重复的数据读取,可能会产生两种完全不同的结果。
  3. REPEATABLE READ(可重复读):这个事务隔离级别保证了一个事务多次读取都是同样的结果,能够解决前面两个隔离级别可能产生的不可重复读问题。另外可重复读是MySQL默认的事务隔离级别。
  4. SERIALIZABLE(可串行化):该隔离级别会强制事务串行执行,同时对读取的每一行数据都加上锁,来。通过这种方式可以解决幻读的事务问题,不过可能导致锁竞争问题和大量的SQL超时。

1.3 幻读

并发事务带来的问题主要有四种,可以用上面我们谈到的事务隔离级别来处理。

  1. 脏读:一个事务读取到另一个事务未提交的数据。

  2. 不可重复读:一个事务多次读取同一数据,另一个事务修改了该数据,导致第一个事务第二次读取数据发现和第一次读取的数据不一致

  3. 幻读:一个事务多次读取同一数据,另一个事务给这些数据插入删除了某些内容,导致第一个事务数据的数量发生改变。

  4. 丢失修改:一个事务修改了某个数据,另一个事务与其读取同一数据且原始值都相同,另一个事务修改数据后提交,导致第一个事务的修改操作丢失。

1.4 处理幻读问题

幻读可以采用我提到的SERIALIZABLE(可串行化)隔离级别来解决幻读,事务按顺序执行,也就不会有幻读问题。

MySQL也提供了其他方法来处理幻读问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值