事务
一系列操作,事务中的操作要么全部成功,要么全部失败。
事务四大特性(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 回滚日志,用于记录数据被修改前的信息,用于保障事务的原子性。