我能在Tarantool的事务中使用yield吗?

我对在事务期间使用yield很感兴趣。它会立即被中断吗?还是其他纤维能够读取尚未提交的更改?

我已经查看了文档,但没有看到相关说明。

点赞
用户13626536
用户13626536

目前,事务中有一种方法可以使用 yield。这是因为现在 memtx 和 vinyl 引擎都有了一个完全可用的事务管理器。

下面是一个工作示例:

local fiber = require('fiber')

-- 如果只使用 box.cfg{},这个应用将失败
box.cfg{memtx_use_mvcc_engine=true}
--box.cfg{}

box.schema.space.create('account', {if_not_exists=true})
box.space.account:format({ {name='id',type='unsigned'},
      {name='first_name',type='string'},
      {name='last_name',type='string'},
})

box.begin()
box.space.account:put({2, "John", "Doe"})

print("sleeping")
fiber.sleep(1)
print("woke up")

box.space.account:put({3, "Ivan", "Ivanov"})

box.commit()

os.exit(0)

请注意 memtx_use_mvcc_engine 选项。它启用了事务引擎。如果没有这个选项,在事务内部使用 yield 将导致立即回滚。

新的事务管理器也将使得事务内部的更改在提交之前对其他线程和事务不可见。在发生冲突 (对同一数据的并行更改) 的情况下,事务将回滚。

2020-10-01 14:19:04