最近在读黄健宏的《Redis设计与实现》,现在看到了事务这章,由于之前(上学)没有好好整理过数据库事务的四大性质,导致现在(工作)看到了就和第一次知道一样((lll¬ω¬))。还是要把基础打好,以后一定要多多整理基础知识。
redis本质上也是一个数据库,它在内存中以键值对的形式操作数据。所以与传统的关系型数据库还是有一定不同的,但在这里,我忽略具体机制的不同,只抽取事务这块,对它的性质进行简单的描述。
在传统的关系型数据库中,常常用ACID性质来检验事务功能的可靠性和安全性。
事务提供了一种将命令打包,然后一次性、有序地执行的机制。
1、原子性(Atomicity)
事务具有原子性指的是,数据库将事务中的多个操作当作一个整体来执行,服务器要么执行事务中的所有操作,要么一个操作也不执行。
拿redis的事务功能来说,事务队列中的命令要么全部执行,要么就一个都不执行,因此redis的事务是具有原子性的。
redis事务与传统关系型数据库事务的最大区别在于,redis不支持事务回滚机制,即使事务队列中的某个命令在执行期间出现了错误,整个事务也会继续执行下去,直到将事务队列中的所有命令都执行完毕为止。
2、一致性(Consistency)
事务具有一致性指的是,如果数据库在执行事务前是一致的,那么在执行事务后,无论事务是否执行成功,数据库也应该是一致的。一致指的是数据符合数据库本身的定义和要求,没有包含非法或无效的错误数据。
3、隔离性(Isolation)
事务的隔离性指的是,即使数据库中有多个事务并发地执行,各个事务之间也不会互相影响,并且在并发状态下执行的事务和串行执行的事务产生的结果完全相同。
因为redis使用单线程的方式执行事务(以及事务队列中的命令),并且服务器保证在执行事务期间不会对事务进行中断,因此redis的事务总是以串行的方式运行的,并且事务也总是具有隔离性的。
4、耐久性(Durability)
事务的耐久性指的是,当一个事务执行完毕时,执行这个事务的结果已经被保存在永久性存储介质中了,即使服务器在事务执行完毕后停机,执行事务所得的结果也不会丢失。
因为redis的事务不过是简单地用队列包裹起了一组redis命令,redis并没有为命令提供额外的持久化功能,所以redis事务的耐久性由redis所使用的持久化模式决定(AOF&appendfsync=always可以实现事务持久化)。