数据库事务有ACID四大特性,这四大特性共同保证了数据库中数据的安全。
那么数据库是如何实现这四大特性的呢?
本文以MySQL的InnoDB引擎为例,详细分析ACID四大事务特性的实现原理;
一、原子性(Atomicity),原子性的特点是一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作;
可以看出,原子性主要体现在两方面:
(1)当事务成功提交时,数据变更;
(2)当事务失败回滚时,数据恢复到事务操作之前的状态;
InnoDB在保证数据库事务原子性的时候,采用了记录回滚日志(undo Log)的方式,操作一条数据时,在事务提交时异步插入一条与当前执行操作相反的记录,具体而言:
(1)当执行insert语句时,插入一条delete语句;
(2)当执行update语句时,插入一条相反的update语句;
(3)当执行delete语句时,插入一条insert语句;
如此,当事务提交成功时,则数据正常保存,有事务回滚时,自动执行对应的undo log ,数据恢复到事务之前的状态,就可以保证数据的原子性了;
举例说明,数据表tbl_leiting中有一条数据:
执行一条 sql: update tbl set name="zhangsan" wh ere id=1;数据变成了如下图所示;
而在undo log中,会存有一条 update语句 update tbl set name="leiting01" where id=1;
当事务回滚时,会执行这条语句,保证事务的原子性;
当事务提交成功后,undo long会被删除;
二,持久性( Durability ),持久性是指事务一旦提交,它对数据库的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
MySQL是在内存中操作数据,然后写入磁盘,由于内存和磁盘的读写速度不一致,有可能出现内存中的数据还没完全写入磁盘,系统崩溃了,这样数据就会出现丢失。
持久性就是为了保证在系统崩溃的情况下,数据不会丢失。
InnoDB采用记录预写日志(redo log)日志的方式保证事务的持久性。
与undo log相反,redo log记录的是新数据的备份,在事务提交后,通过异步的方式持久化。
三,隔离性( Isolation ),理论上来说,不同事务之间在并发执行时是不应该相互影响的,其执行效果应该等同于事务串行执行。但实际上,完全的事务隔离会严重影响事务并发执行的效率,降低数据库性能,因此,针对不同的需求,数据库事务定义了四种不同的隔离级别,事务对数据的可见性是不一样;
Innodb对事务的隔离性主要通过MVCC(多版本并发控制)和锁两种技术来实现;
MVCC技术的目的是在事务多并发执行时,尽量不加锁,实现原理是利用undo log构造历史记录,在事务并发执行时,读取当前事务执行之前的最新版本。
四 、一致性( Consistency ),一致性的含义是数据库总是从一个一致性的状态转换到另一个一致性的状态。
一致性是事务的根本追求,数据库通过事务并发控制技术(隔离性)和日志恢复技术(原子性,持久性)共同保证数据的一致性;
未完待续;