MySQL学习——事务

事务

一系列操作,事务中的操作要么全部成功,要么全部失败。

事务四大特性(ACID)

  • 原子性:事务中所有操作,要么全部成功;要么撤回到执行事务之前的状态。

  • 一致性:事务的执行使得数据库从一种正确状态转换成另一种正确状态。

  • 隔离性:事务操作之间彼此独立和透明互不影响。

  • 持久性:事务一旦提交,其结果就是永久的。即便发生系统故障,也能恢复。

并发事务带来的问题

  • 脏读(Dirty Read):一个事务可以读取其他事务未提交的执行结果

  • 丢失修改(Lost to modify):第一个事务中修改了这个数据后,第二个事务也修改了这个数据。

  • 不可重复读(Nonrepeatable Read):在同一次事务中,同一个查询在 T1 时间内读取某一行,在 T2 时间重新读取这一行,这一行发生了 UPDATE 或者 DELETE

  • 幻读(Phantom Read):用户读取某一范围的数据行时,另外一个事务在范围内 插入 insert 了新行,用户再次读取时,发现新的幻影行。

不可重复读重点在于 update 和 delete,而幻读的重点在于 insert。

InnoDB 通过多版本并发控制(MVCC,Multiversion Conccurrency Control)解决不可重复读问题,在此基础上通过间隙锁解决幻读问题。

事务隔离级别(解决并发事务带来的问题)

  • 读未提交(Read Uncommited):所以事务能够看到其它未提交事务的结果。

  • 读已提交(Read Commited):一个事务只能看到其它已经提交事务的结果。

  • 可重复读(Repeatable Read):MySQl 默认事务级别,确保同一事务的多个实例在并发读取数据时,会看到相同的数据行。

  • 串行化(Serializable):强制事务排序,使之不可能出现冲突。在读取的数据行上面加上共享锁

事务怎么通过日志实现的

  • redo log 重做日志,用来恢复数据,用于保障已提交事务的持久化特性。

    • 内存中的重做日志缓冲

    • 重做日志文件

  • undo log 回滚日志,用于记录数据被修改前的信息,用于保障事务的原子性。

一文了解InnoDB事务实现原理