datomic数据库的事务是ACID的:Atomic(原子性),Consistent(一致性),Isolated(隔离性),Durable(持久性)。
原子性要求每一个事务要么就全部执行,要么就全不执行。如果事务中某部分操作失败,那么整个事务也就失败,数据库应该没有任何变化。
datomic的事务(transaction)在被写入到持久储存的数据库的过程,是一个原子性写操作,所以能够保证其原子性;而在每一个客户端(peer)的程序内部,datomic是存在于内存中的(这是datomic数据库高性能的一个重要因素)。内存中的datomic使用的是一个不可变数据结构,同时,对它的每个更新操作都是在一个原子性操作中完成。
一致性确保任何事务能够将数据库从某一合法状态改变到另一种合法状态。
datomic通过以下途径保证一致性:
另外,datomic还提供了一些类用于访问这些时间戳信息:
为了正确实现域模型,事务需要能够在已有事实的基础之上推导出新的事实(比如增加某个银行账户的余额),同时强化领域特定功能性约束(如,一个合法的账户必须包含姓名、邮箱以及密码)。Datomic的transaction funcions为事务提供了一些灵活的功能性约束,包括了乐观和悲观的并发策略。
Datomic是一个单写系统(single-writer system),进程中有一个单独的现场负责事务的写入,而datomic事务的隔离性正是源自于此,因为没有并发的事务,所以事务总是顺序执行。
多线程同时写一个资源,必然存在竞争,因此就要用到锁这些堵塞方法,如果使用非阻塞的单线程进行写操作,比多线程写速度还要快,吞吐量高、延迟低。在多核处理器的场景下,其实更适合使用单写模式,假设理想模式下,写线程占一个CPU核,其他操作则可以利用其他CPU核并发执行。
注: 更多资料和搜索“单写操作设计”。
持久性指的是一旦某个事务被提交(commit),则它就已经记录在持久的存储器中。
Datomic是完全持久的——它在执行事务之后,会一直等待存储器的“承认”通知,保证在得到存储器的承认之后,它才会宣布一个事务已经完成。