我可以在 Tarantool 中进行交易吗?
Can I yield during an transaction in Tarantool?
我很好奇交易过程中的收益率。会立即中断吗?或者其他纤程是否能够读取尚未提交的更改?
我忽略了文档但没有看到它。
目前在交易中有yield的方法。这是因为现在有一个用于 memtx 和 vinyl 引擎的全功能事务管理器。
这是一个工作示例:
local fiber = require('fiber')
-- If you just use box.cfg{}, this app will fail
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 将导致立即回滚。
新的事务管理器还将在事务内部进行更改,以便在提交之前对其他纤程和事务不可见。并且如果发生冲突(对同一数据的并行更改),事务将被回滚。
我很好奇交易过程中的收益率。会立即中断吗?或者其他纤程是否能够读取尚未提交的更改?
我忽略了文档但没有看到它。
目前在交易中有yield的方法。这是因为现在有一个用于 memtx 和 vinyl 引擎的全功能事务管理器。
这是一个工作示例:
local fiber = require('fiber')
-- If you just use box.cfg{}, this app will fail
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 将导致立即回滚。
新的事务管理器还将在事务内部进行更改,以便在提交之前对其他纤程和事务不可见。并且如果发生冲突(对同一数据的并行更改),事务将被回滚。