事务概览

ByteHouse 中的每条 SQL 语句都会隐式地转化为一个事务来执行,并且该事务提供了原子性、一致性、隔离性和持久性 (ACID) 属性,旨在在出现错误、网络故障、机器故障和其他事故的情况下保证数据的有效性。 一个语句中写入的所有数据都是原子的,其他语句不会看到部分数据。 对于一个写操作,所有的数据会同时可见,并且在写操作成功后持久化。 在此之前,其写入的任意数据对其他语句是不可见的。 如果写操作失败,ByteHouse 将回滚当前事务,并自动清理该语句写入的中间数据。

目前,尚不支持通过执行 BEGIN 语句启动事务。

隔离级别

在 4 种隔离级别中 ByteHouse 当前仅支持 READ COMMITTED 级别的事务隔离。

  • 读未提交 (READ UNCOMMITTED)

  • 读已提交 (READ COMMITTED)

  • 可重复读 (REPEATABLE READ)

  • 串行化 (SERIALIZABLE)。

Isolation LevelDirty WriteDirty ReadFuzzy ReadPhantom
READ UNCOMMITTEDNot PossiblePossiblePossiblePossible
READ COMMITTEDNot PossibleNot possiblePossiblePossible
REPEATABLE READNot PossibleNot possibleNot possiblePossible
SERIALIZABLENot PossibleNot possibleNot possibleNot possible

在 READ COMMITTED 隔离级别下,一个事务要等另一个事务提交后才能读取数据。

并发控制

并发控制用于保证并发更新时的数据正确性。 ByteHouse 使用资源锁进行并发控制,可以在不同的资源(例如数据库、表和分区)上添加锁。 锁会阻止其他事务修改相同的资源,直到锁被释放。 如果一个事务被阻塞,运行该事务的用户会收到一条消息来显示当前显示阻塞当前事务的其他事务信息。 消息将会显示为“当前事务与其他 txn (txn_id: xxx) 冲突”。 如果收到此消息,建议等待该事务释放锁后再进行操作

ByteHouse 利用 MVCC (multi-version concurrency control) 来提高并发读写的性能,保障读不会受到在同一资源上的其他写入的影响或阻塞。