Cassandra事务与关系型数据库事务有何区别

Cassandra不会使用回滚和锁机制来实现关系型数据的ACID事务,相比较于提供原子性,隔离性和持久化,Cassandra提供最终(可调节的)一致性,让用户决定为每一个事务提供强一致性或者最终一致性。html

做为非关系型数据库,Cassandra不支持join或者外键,所以Cassandra不提供ACID层面的一致性。例如,当从帐户A转帐给帐户B,整个帐户总额不该该改变。Cassandra支持row-level的原子性和隔离性,为了提供高可用和更快的写入性能,牺牲了事务的隔离性和原子性。Cassandra写操做是持久化的。数据库

原子性

在Cassandra中,写入操做时partition level的原子性,意味着同一分区的2行或者多行的写入或者更新被当作同一写入操做。删除操做一样是partition level。markdown

例如,若是写一致性为QUORUM,relication factor为3,Cassandra会将写操做复制到集群中的全部的节点,而后等待2个节点的应答。若是某个节点写入失败了可是其余节点成功了,Cassandra会在失败的节点报告失败。然而,其余成功写入的节点不会自动进行回滚。性能

Cassandra使用客户端的时间戳来决定一列的最新更新。当请求数据的时候,最新的时间戳赢,所以若是多个客户端会话同时更新一行的相同列,最后更新的才会被读操做看到。htm

隔离性

Cassandra 写和删除操做是彻底行level的隔离性。这意味着在单个节点上的一个分区,对客户端来讲一次只能写入一行。这个操做范围是严格受限的,直到他完成。在一个batch操做中的全部更新,属于同一个给定的partition key有同样的限制。然而,若是batch操做中包含超过一个分区的更新,并非隔离的。事务

持久化

Cassandra中的写操做是持久化的。一个节点上的全部写操做在收到应答标记写入成功以前都会写入到内存和磁盘的commit log中。若是在memtables flush到磁盘以前,突然宕机或者节点失败,commit log 能够用来在节点恢复重启时找回丢失的写入操做。除了本地的持久化(数据当即写入到磁盘中),其余节点上存有副本也加强了持久化。内存

能够经过使用commitlog_sync选项来管理本地的持久化,知足对于一致性的需求。设置选项为periodic 或者batchget

相关文章
相关标签/搜索