ACID
原子性(Atomicity)
在整个事务中,要么全部完成,要么全部不做,即如果某个操作失败就会将之前所有操作回滚,恢复到事务之前。
一致性(Consistency)
事务执行必须保证系统的一致,在事务开始之前和事务结束以后,数据库的完整性没有被破坏。例如A转钱给B,他们开始各有五百,不管发生什么,他们的总和还是一千。
隔离性(Isolation)
事务与事务之前不会互相影响的级别。隔离级别:
1)Read Uncommitted(读取未提交内容)
事务a | 事务b |
BEGIN; | |
BEGIN; | |
SELECT name FROM t; (name = 小刚) | |
UPDATE t SET name = `小明`; | |
SELECT name FROM t; (name = 小明) | |
COMMIT; |
若事务B数据回滚,事务A中间就会有脏数据
2)Read Committed(已提交读)
事务a | 事务b |
BEGIN; | |
BEGIN; | |
SELECT name FROM t; (name = 小刚) | |
UPDATE t SET name = `小明`; | |
SELECT name FROM t; (name = 小刚) | |
COMMIT; | |
SELECT name FROM t; (name = 小明) |
3)Repeatable Read(可重读)
事务a | 事务b |
BEGIN; | |
BEGIN; | |
SELECT name FROM t; (name = 小刚) | |
UPDATE t SET name = `小明`; | |
SELECT name FROM t; (name = 小刚) | |
COMMIT; | |
SELECT name FROM t; (name = 小刚) | |
COMMIT; | |
SELECT name FROM t; (name = 小明) |
4)Serializable(可串行化)
事务a | 事务b |
BEGIN; | |
BEGIN; | |
UPDATE t SET name = `小明`; | |
SELECT name FROM t; (等待中) | |
COMMIT; | |
结束等待,执行语句 |
持久性(Durability)
一旦事务提交,那么事务对数据所做的变更就完全保存在了数据库仲,即使发生停电,系统绐机也是如此。
例如,事务执行一半断电了,当服务器重启时,会从日志中找到记录,回滚恢复。
Undo日志
为了满足事务的原子性,在操作任何数据之前,先将数据备份到Undo log,然后进行数据的修改,一旦出现错误或者回滚,系统可以利用Undo log中的备份数据恢复到事务开始之前的状态。
Redo日志
和Undo日志相反,Redo log记录的是新数据的备份。事务提交前,只要将Redo log持久化即可,不需要直接将数据持久化,减少IO的次数。数据持久化将异步执行。Redo log写磁盘会发生在事务提交之前,或redo log buffer满了。
例子:事务A=1,B=3,想将A设置为2,B设置为4
事务开始
a.将A=1,B=3记录到undo log buffer
b.修改A=2
c.将A=2记录到redo log buffer
(若此时失败回滚)--- 将取出undo log buffer,将A设置回1.
e.修改B=4
将B=4记录到redo log buffer
d.将Undo log写入磁盘
e将Redo log写入磁盘
(若此时断电)--- 将取出redo数据,将A设置回2.再触发Undo log回滚恢复。
f.事务提交
(若此时断电)--- 将取出redo数据,将A设置回2.