什么是事务?

事务用于处理操作量大,复杂性高的数据,例如,我们删除一个成员的数据时,既要删除成员信息表的数据又要删除该成员的基本资料表的数据,由多个数据库紧密关联操作的语句构成一个事务。

事务的四个特性:

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日志可以在事务发生错误时进行回滚。

事务的隔离性由锁实现,锁的部分将在下一篇文章简述。