Re: Программная реализация длинных транзакций
От: remark Россия http://www.1024cores.net/
Дата: 16.09.06 07:41
Оценка: 1 (1)
Здравствуйте, Michael_Y, Вы писали:

M_Y> Всем привет.


M_Y> Господа ГУРУ проектирования, нуждаюсь в вашем совете.


M_Y> Есть база данных с где-то 20 таблицами, из которых 10 справочники. База содержит данные о подразделениях компании. Есть главная таблица "Подразделение" и все остальные связаны с ней.

M_Y> Задача — вносить изменения в базу "проектами". Т.е. выбираем подразделение для редактирования, правим что хотим, сохраняем изменения в какую-то "корзинку", через пару недель возвращаемся к редактированию этого подразделения. Еще через неделю одним махом применяем изменения на базе.
M_Y> Осложняет задачу наличие информации вида "список зданий подразделения", "список фотографий каждого здания". И это тоже надо редактировать.

M_Y> Сейчас остановился на варианте заведения таблицы вида (ИД проекта, имя таблицы, имя поля, новое значение поля, операция (удаление, изменение, вставка)). Пытаюсь _красиво_ реализовать загрузку и сохранение данных в эту таблицу.

M_Y> Вариант с дублирование таблиц и тем более заведением отдельной базы для хранения изменений отбросил из соображений неэкономности и "некрасивости".

M_Y> У кого-то есть опыт реализации такой задачи? Поделитесь плиз


Добавляешь к каждой таблице 3 поля: идентификатор "длительной транзакции", код действия (запись изменена/удалена/добавлена), номер версии (таймстамп) оригинальной записи (для разрешения конфликтов)

Когда пользователь начинает транзакцию, создаёшь в спец. табличке запись с описанием этой транзакции.
Далее когда он изменяет какую-либо запись, то делаешь её копию, заполняешь идентификатор транзакции, версию оригинальной записи, код действия — изменение.
Аналогично для удаления/создания, только код действия другой.

Кодга пользователь коммитит транзакцию, то ищешь все записи, помеченные идентификатором этой транзакции, сверяешь номера версий оригинальной записи (не изменили ли её ещё) и вносишь изменение.

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

Что бы не искать все изменённые записи относящиеся к транзакции, можно в отдельную табличку вынести пары (код таблицы, номер записи) для изменённых записей и привязать к транзакции. Тогда можно будет удобно посмотреть список всех изменений в транзакции.



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.