Показать сообщение отдельно
  #39  
Старый 04.09.2014, 12:36
kaakaa
 
Сообщения: n/a
По умолчанию

Как я понимаю, мы имеем один документ и много изделий связанных с ним.

Нужно, чтобы добавление/изменение нескольких изделий происходили в рамках одной транзакции.
Если записи будут коммититься в разных транзакциях, возможно ситуация, когда другой пользователь сделает запрос к документу, но увидит не все связанные с ним изделия.

ВАРИАНТЫ:

Как можно решить эту проблемму:
1) Кэшировать изменения/вставку. После того как пользователь закончил ввод, он нажимает кнопку сохранить и все данные коммитятся в рамках одной транзакции. Если датасет не умеет кэшировать данные, можно сделать прослойку в виде временной таблицы, вы делали это через MemTable.
Но при коммите прийдется использовать last_insert_id( ) чтобы получить id мастера.

2) Проблема получения ID мастер таблицы актуальна. Вероятно, решить ее в рамках мускула можно вставкой записи без подтверждения транзакции и выполнив last_insert_id( ). Это предположение, его я не проверял.

Зная ID мастер-записи, вы можете добавлять записи в дечернюю таблицу в рамках активной транзакции в которой была выполнена вставка мастер-записи.

Если пользователь захочет все отменить, он просто откатит транзакцию. Если захочет все применить, он ее прокоммитит.

Пока транзакция не подтверждена, другие пользователи не видят записи, которые были в ней созданы.

Недостатком этого подхода можно считать длинную WRITE транзакцию, которая косвенно может блокировать часть данных. Однако, это плохой тон.
Ответить с цитированием