Cassandra不使用回滚和锁机制来实现关系型数据的ACID事务,而是提供最终(可调节的)一致性(consistancy)的atomic, isolated, and durable 事务,让用户决定为每个事务提供强一致性或者最终一致性。
作为非关系型数据库,Cassandra不支持join或者外键,因此Cassandra不提供真正ACID层面的一致性。例如,当从账户A转账给账户B,整个账户总额不应该改变。Cassandra支持row-level的原子性和隔离性,为了提供高可用和更快的写入性能,牺牲了transaction-level的原子性和隔离性。Cassandra写操作是持久化的。
Atomicity
写入操作在partition level满足原子性,即同一partition的2行或者多行的写入或者更新被当做一次写入操作(one write operation)。删除操作同样是partition level。
例如,如果写一致性为QUORUM,relication factor为3,Cassandra会将写操作复制到集群中的所有的节点,然后等待2个节点的应答。如果某个节点写入失败了,但是其他节点成功了,Cassandra会报告,此次同步该节点失败。然而,其他成功写入的节点不会自动进行回滚。
Cassandra使用客户端的时间戳来决定一列的最新更新。当请求数据的时候,最新的时间戳赢,因此如果多个客户端session同时更新一行的相同列,最后更新的才会被读操作看到。
Isolation
写入和删除操作在row level满足隔离性。即对单个node上的单个partition的单行的写入,只对此客户端可见(对其他的客户端是不可见的)。即在此次写入操作完成前,它的scope是严格受限的。若一个batch操作的所有更新,都是属于同一个partition key的,那么此batch是满足隔离性的。然而,如果batch操作涉及到一个以上partition的更新,并不是隔离的。
Durability
Cassandra中的写操作是持久化的。一个节点上的所有写操作,在收到应答标记写入成功之前,都会写入到内存和磁盘的commit log中。如果在memtables flush到磁盘之前,忽然宕机了,在阶段重启恢复时,可以通过replay commit log 找回丢失的写入操作。除了本地的持久化(数据立即写入到磁盘中),其他节点上存有副本也增强了持久化。
可以使用commitlog_sync参数来管理本地的持久化,满足对于一致性的需求。设置选项为periodic 或者batch。
网友评论