![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Транзакции [D7, MSSQL]
SeZu © (2006-03-30 14:04:00)При добавлении или редактировании записи в таблице у меня запускается транзакция. Когда в это же время на другом компьютере пытаешься просмотреть эту таблицу, все подвисает пока не завершится транзакция или не истечет таймаут запроса.
Как сделать чтобы можно было одновременно редактировать записи и просматривать таблицу.
Работаю через АДО. Транзакция на запись и редактирование обязательно должна быть.
Bless (2006-03-31 15:17:00) [1]Упс, провтыкал [6]
Bless (2006-03-31 15:16:00) [2]SeZu (30.03.06 14:04) >
Че-то я не пойму.
Перевод строки (в гриде, например) в состояние редактирования заблокирует эту строку только если LockType стоит ltPessimistic. По умолчанию стоит ltOptimistic и никаких проблем быть не должно в этом случае.
Если же строка не просто переводится в состояние редактирования, а как-то явно накладывается транзакция, то хотелось бы взглянуть на код.
ЮЮ © (31.03.06 07:56) [14]>
Ну и причем тут BatchOptimistic?
ЮЮ (2006-03-31 07:56:00) [3]TCustomADODataSet.LockType
type TADOLockType = (ltUnspecified, ltReadOnly, ltPessimistic, ltOptimistic, lt BatchOptimistic);
Nikolay M. (2006-03-30 19:29:00) [4]
> если надо пришли письмом свою, добавлю
У меня в анкете указана. Не то чтобы надо, но что-то я у тебя утром спросил и забыл :(
Nikolay M. (2006-03-30 19:28:00) [5]
> sniknik ©
Дык раньше же получал! За что из контакта удалил? :)
sniknik (2006-03-30 18:20:00) [6]если надо пришли письмом свою, добавлю.
sniknik (2006-03-30 18:19:00) [7]> Кстати, почему на аську не отзываешься?
у меня стоит игнорировать все кто не в списке (я тебя даже не заметил ;)
Nikolay M. (2006-03-30 16:06:00) [8]
> > сделать в таблицах флажок типа состояния записи "редактируется\введена".
>
> не поможет. блокируется то таблица, а не запись.
Ты меня удивляешь.
Я имел ввиду, что с помощью флажка отказаться от транзакций вообще. И никаких блокировок не будет.
Кстати, почему на аську не отзываешься?
sniknik (2006-03-30 15:21:00) [9]> завтра все должно работать!
мечтатель...
> сделать в таблицах флажок типа состояния записи "редактируется\введена".
не поможет. блокируется то таблица, а не запись.
но можно наверное с "грязным" чтением транзакции открывать, или в запросе это указывать. но тут еще незвестно как оно себя поведет, пробовать надо, да еще после, если получится, коллизии возможные отлавливать... нет не стоит.
лучше идти по первому пути.
Nikolay M. (2006-03-30 15:10:00) [10]Путь первый, правильный: снять с заказчика денег на доработку, если в исходной задаче многопользовательская работа не была предусмотрена и сделать все по уму. Если это подразумевалось - ты сам виноват.
Путь второй, неправильный: сделать в таблицах флажок типа состояния записи "редактируется\введена".
SeZu (2006-03-30 15:00:00) [11]Транзакция одна.
В общем есть таблица с карточками у коророй есть еще 5 подчиненных таблиц в которых содержатся дополнительные периодические поля каждой карточки. Причем как таблице карточек, так и в подчиненных таблицах примерно полей по 20-30 в каждой.
В общем при редактировании карточки, узер может добавлять, редактировать, удалять записи в подчиненных таблицах. И при нажатии ОК все сохраняется, либо отменяется по Отмена.
А при добавлении новой карточки, такая фишка, долна полностью скопироваться предыдущая введенная карточка и все записи из подчиненных таблиц тоже должны скопироваться, далее юзер немного правит ее и либо ОК, либо Отмена.
Короче все это прекрасно работало с транзакцими на одном компе, но заказчику вдруг понадобилось делать все это на двух компах и тут начались висяки.
И переделывать программу на другой лад, уже просто не реально, завтра все должно работать! Следовательно надо разобраться с транзакциями.
sniknik (2006-03-30 14:40:00) [12]> чтобы потом либо воспроизводить все эти действия, либо ничего не делать
что транзакциями "откат" реализован?
> Тебя пользователи еще не убили? ;)
> И наиболее оптимальный путь решения - это через транзакции.
это ты глубоко ошибаешся. оптимальный путь это использовать то для чего это предназначено, но не для другого. (обода от бочки ты же не вставляеш заместо колес велосипеду? хотя тоже круглые и по размеру подходят. или... а вдруг? ;)
см. нелп по Cashed Updates.
> Что-то мне подсказывает, что ClientDataSet - твой выбор.
не стоит. в ADO это встроено. (может "не в том обьеме", но большая часть. даже не заметиш разници по функционалу, но проще в работе)
Nikolay M. (2006-03-30 14:36:00) [13]
> иначе мне придется запоминать огромную кучу манипуляций
> пользователя, чтобы потом либо воспроизводить все эти действия,
> либо ничего не делать
Что-то мне подсказывает, что ClientDataSet - твой выбор.
> очень сильно затрудняет решение задачи
Смирись - это издержки профессии.
> И пусть пользователи хоть чай пьют, хоть в отпуск уходят!
А вот при таком подходе ушедшим однажды можешь оказаться ты, причем совсем не в отпуск.
На пальцах скажи, что делаешь?
Mike Kouzmine (2006-03-30 14:35:00) [14]SeZu (30.03.06 14:26) [2] А транзакции все одинаковые?
SeZu (2006-03-30 14:26:00) [15]Транзакция необходима для решения задачи, иначе мне придется запоминать огромную кучу манипуляций пользователя, чтобы потом либо воспроизводить все эти действия, либо ничего не делать, что очень сильно затрудняет решение задачи!
И наиболее оптимальный путь решения - это через транзакции. И пусть пользователи хоть чай пьют, хоть в отпуск уходят!
Nikolay M. (2006-03-30 14:16:00) [16]
> SeZu (30.03.06 14:04)
> При добавлении или редактировании записи в таблице у меня
> запускается транзакция.
Тебя пользователи еще не убили? А если кто-то начал что-то редактировать и ушел чай пить? Одно из первых правил в блокировочных серверах БД: транзакции должны быть максимально короткими.