美文网首页
Database internals - Cassandra事务

Database internals - Cassandra事务

作者: Michelle_G | 来源:发表于2020-09-20 11:21 被阅读0次

    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。

    相关文章

      网友评论

          本文标题:Database internals - Cassandra事务

          本文链接:https://www.haomeiwen.com/subject/fymuyktx.html