4

什么是事务

事务(Transaction)是数据库区别于文件系统的重要特性之一。

数据库引入事务的主要目的:事务会把数据库从一种抑制状态转换为另一种一致状态。在数据库提交工作时,这种机制能够保证在一组的sql语句要么都成功执行、要么都不执行。

事务的基本要素(ACID)

事务用来保证数据库的完整性

  • 原子性(atomicity):事务中所有操作要么全部成功,要么全部失败
  • 一致性(consistency):从一种状态转变为下一种一致状态。事务开始前和结束后,数据库的完整性约束没有被破坏。
  • 隔离性(isolation):一个事务的影响在提交前对其他事务都不可见
  • 持久性(Durability):一旦提交,结果就是永久性的。

InnoDB中的事务完全符合ACID的特性

数据库事务的隔离级别

数据库事务的隔离级别有4种,由低到高分别是:

  • 未提交读(Read uncommitted
  • 已提交读(read committed
  • 可重复读(repeatable read
  • 可串行化(Serializable

image.png

未提交 读(Read uncommitted

允许脏读,就是一个事务可以读取另一个未提交事务的数据。

eg:

老板要给员工发工资,员工的工资是3000/月。但是发工资时老板不小心按错了数字,按成5000/月,但是该事务还没有提交,就在这时,员工去查看自己这个月的工资,发现(5000)比往常多了2千元,以为涨工资了非常高兴。

已提交读(read committed

只能读取到已经提交的数据(就是事务要等另一个事物提交后才能读取数据)
eg:

小明拿着工资卡去超市购物(卡里当然是只有3000),当他卖单时(事务开启),收费系统事先检测到他的卡里有3000,就在这个时候!!小明的对象把卡里的钱全部转了出去,并提交事物(提交完成)。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了。

可重复读(repeatable read

就是在开始读取数据(事物开启)时,不再允许修改操作。

eg:

小明拿着工资卡去超市购物(卡里当然是只有3000),当他卖单时(事务开启,不允许其他事务的UPDATE修改操作),收费系统事先检测到他的卡里有3000。这个时候任何人不能转出金额了。接下来收费系统就可以扣款了。

可串行化(Serializable

最高的事务隔离级别,在该级别下,事务串行化顺序执行,读写相互都会阻塞。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不用。

eg:

小明拿着工资卡去ATM机(卡里当然是只有3000),当他取钱时(事务开启),ATM查询到他的卡里有3000。这个时候在向卡里存200。此时只有当查的事物完成时,存的事物才会执行。

总结

简单来说: 事物就是在数据库提交工作时,要么所有修改都保存,要么所有修改都不保存。


潘佳琦
894 声望34 粉丝

为 API 生,为框架死,为 debug 奋斗一辈子;