什么是事务?
事务用于处理操作量大,复杂性高的数据,例如,我们删除一个成员的数据时,既要删除成员信息表的数据又要删除该成员的基本资料表的数据,由多个数据库紧密关联操作的语句构成一个事务。
事务的四个特性:
A(atomicity):原子性
定义:事务的操作是一个不可分割的整体,执行时操作要不全部执行成功,要不全部执行失败
C(consistency):一致性
定义:事务使数据库中的数据从一个一致性状态到另一个一致性状态,事务的一致性与原子性是密切相关的。
I(isolation):隔离性
并发执行的各个事务不会互相干扰
D(durability):持久性
事务执行的结果应该是被永久性保存在数据库中的。
最经典的例子就是银行转账的操作:
A给B转账100元,A的账户应当扣除100元,B的账户应当增加100元 | 这两个操作时原子性的,要不都成功,要不都失败 |
A的账户不能凭空消失100元,B的账户也不会凭空多出100元,数据前后都是一致性的状态 | 一致性 |
A给B转账的同时,不能影响C给A转账 | 隔离性 |
A给B转账100元,A的账户应当扣除100元,B的账户应当增加100元,这个事务的结果是永久性保存在数据库中的,不会因为数据库崩溃导致结果的丢失 | 持久性 |
如何保障事务的几大特性:
redo log重做日志,保证事务的原子性与持久性。
当事务提交时,将事务的所有日志写入到重做日志文件进行持久化,重做日志分为两部分:一是内存中的重做日志缓冲,易丢失,二是重做日志文件,磁盘上,持久的。日志写到重做日志缓冲中,然后调用fsync将缓冲文件刷新到磁盘上进行持久化,从而保证事务的持久化。
重做日志以块为单位进行存储,一块的大小为512字节,超过512字节的部分,将分到下个块中,块的大小与扇区的大小相同,都是512字节,可以保证事务的原子性。
undo log用来保证事务的一致性。数据库不但会产生redo日志,还会产生undo日志,这些undo日志可以在事务发生错误时进行回滚。
事务的隔离性由锁实现,锁的部分将在下一篇文章简述。