Как я понимаю, мы имеем один документ и много изделий связанных с ним.
Нужно, чтобы добавление/изменение нескольких изделий происходили в рамках одной транзакции.
Если записи будут коммититься в разных транзакциях, возможно ситуация, когда другой пользователь сделает запрос к документу, но увидит не все связанные с ним изделия.
ВАРИАНТЫ:
Как можно решить эту проблемму:
1) Кэшировать изменения/вставку. После того как пользователь закончил ввод, он нажимает кнопку сохранить и все данные коммитятся в рамках одной транзакции. Если датасет не умеет кэшировать данные, можно сделать прослойку в виде временной таблицы, вы делали это через MemTable.
Но при коммите прийдется использовать last_insert_id( ) чтобы получить id мастера.
2) Проблема получения ID мастер таблицы актуальна. Вероятно, решить ее в рамках мускула можно вставкой записи без подтверждения транзакции и выполнив last_insert_id( ). Это предположение, его я не проверял.
Зная ID мастер-записи, вы можете добавлять записи в дечернюю таблицу в рамках активной транзакции в которой была выполнена вставка мастер-записи.
Если пользователь захочет все отменить, он просто откатит транзакцию. Если захочет все применить, он ее прокоммитит.
Пока транзакция не подтверждена, другие пользователи не видят записи, которые были в ней созданы.
Недостатком этого подхода можно считать длинную WRITE транзакцию, которая косвенно может блокировать часть данных. Однако, это плохой тон.
|