Базы данных вообще не поддерживают семантику оформления заказа. Базы данных гарантируют изоляцию транзакции, но поскольку они не гарантируют, что транзакция завершится успешно, они могут позволить другой транзакции продолжить работу со старой версией данных, которую другая транзакция только что изменила (и еще не зафиксировала), и если транзакции фактически становятся несериализуемыми Откатывай обратно. Даже если они используют блокировку, они все равно не поддерживают ее явно. Вы читаете строку, она становится заблокированной для чтения, и если вы пишете ее, она становится заблокированной для записи, но вы не можете ее контролировать.
В частности, Sqlite блокирует всю базу данных, когда вы начинаете запись в транзакции, если только не в режиме WAL. Вы можете форсировать блокировку, начав транзакцию с begin immediate
вместо begin
. Однако в режиме WAL он поддерживает некоторый параллелизм. К сожалению, я не знаю точный режим.
В любом случае, вам, вероятно, придется реализовать семантику оформления заказа самостоятельно. Или обойтись без него, потому что семантика оформления заказа довольно сложна из-за необходимости иметь дело с устаревшими проверками.