当前位置: 首页 > 工具软件 > Datomic > 使用案例 >

datomic数据库——ACID(1)

逑和蔼
2023-12-01

ACID

datomic数据库的事务是ACID的:Atomic(原子性),Consistent(一致性),Isolated(隔离性),Durable(持久性)。

原子性

原子性要求每一个事务要么就全部执行,要么就全不执行。如果事务中某部分操作失败,那么整个事务也就失败,数据库应该没有任何变化。

datomic的事务(transaction)在被写入到持久储存的数据库的过程,是一个原子性写操作,所以能够保证其原子性;而在每一个客户端(peer)的程序内部,datomic是存在于内存中的(这是datomic数据库高性能的一个重要因素)。内存中的datomic使用的是一个不可变数据结构,同时,对它的每个更新操作都是在一个原子性操作中完成。

一致性

一致性确保任何事务能够将数据库从某一合法状态改变到另一种合法状态。

datomic通过以下途径保证一致性:

  • 每个客户端(peer)将已完成的事务看作是一个特殊的时间点,我们称之为时间戳(time basis)。
  • 在一个系统中,事务的时间戳(time basis)是事务在该系统中的一个全局性的指令(ordering),所有的客户端总是能够看到该时间戳之前(包含该时间戳)的所有事务(也就是说,datomic的所有事务都被存储),并且所有的事务都是按时间顺序排列的。

另外,datomic还提供了一些类用于访问这些时间戳信息:

  • 每个存储于datomic数据库中的事实(fact)都知道组成datom的每个事务的时间戳。
  • 每个数据库值(注:datomic设计哲学中,数据库也被当成一个值)都知道最近一个事务的时间戳,这个可通过Database.basisT来获取。
  • 所有客户端(peers)都能同步每一个时间戳的值,通过 Connection.sync。 (注:datomic数据库系统中,某个peer修改的数据,会同步到其他peers)

为了正确实现域模型,事务需要能够在已有事实的基础之上推导出新的事实(比如增加某个银行账户的余额),同时强化领域特定功能性约束(如,一个合法的账户必须包含姓名、邮箱以及密码)。Datomic的transaction funcions为事务提供了一些灵活的功能性约束,包括了乐观和悲观的并发策略。

隔离性

Datomic是一个单写系统(single-writer system),进程中有一个单独的现场负责事务的写入,而datomic事务的隔离性正是源自于此,因为没有并发的事务,所以事务总是顺序执行。

多线程同时写一个资源,必然存在竞争,因此就要用到锁这些堵塞方法,如果使用非阻塞的单线程进行写操作,比多线程写速度还要快,吞吐量高、延迟低。在多核处理器的场景下,其实更适合使用单写模式,假设理想模式下,写线程占一个CPU核,其他操作则可以利用其他CPU核并发执行。

注: 更多资料和搜索“单写操作设计”。

持久性

持久性指的是一旦某个事务被提交(commit),则它就已经记录在持久的存储器中。

Datomic是完全持久的——它在执行事务之后,会一直等待存储器的“承认”通知,保证在得到存储器的承认之后,它才会宣布一个事务已经完成。

 类似资料: