Delphi + ADO + вложенные транзакции ?
Петр
Дата: 16.12.2002 13:15:28
Кто как решает проблему блокировок строк в таблице БД при выборке этих строк для редактирования.
Например user1 в таблице1 select-ом в DBGrid выбирается n строк принадлежащих какому-то документу1. Как заблокировать для редактирования эти строки для других user-ров. И различить вложенные транзакции для user1 если он для редактирования открыл несколько документов.
В ADO begin - commit transaction не имеют имени транзакции.
Alex Hazov
Дата: 16.12.2002 13:46:50
Кто как решает проблему блокировок строк в таблице БД при выборке этих строк для редактирования.
Если использовать Select + Update, то видимо надо доп поле в таблицу с признаком блокировки записи. Если править прямо в recordset'e, то он сам должен управлять блокировками.
Например user1 в таблице1 select-ом в DBGrid выбирается n строк принадлежащих какому-то документу1. Как заблокировать для редактирования эти строки для других user-ров. И различить вложенные транзакции для user1 если он для редактирования открыл несколько документов.
Разве можно открыть несколько recordset'ов в одной коннекции ?
В ADO begin - commit transaction не имеют имени транзакции.
begin transaction возвращает уровень вложенности:
BeginTrans can be called as a function that returns a Long variable indicating the nesting level of the transaction.
VVG_
Дата: 16.12.2002 14:08:12
Вообще говоря, на каждый рекордсет нужно открывать по две (а еще лучше - по три) коннекции. Соответственно возрастает количество дополнительных вложенных блокировок. И значительно меньше сбоев из-за проблем со связью.
Петр
Дата: 16.12.2002 15:35:47
BeginTrans can be called as a function that returns a Long variable indicating the nesting level of the transaction
Уровень вложенности показывает, но если открыто две транзакции (типа Tran1: редактируется один документ, Tran2: редактируется второй), то после commit закроется вторая транзакция (внутренняя), а вполне возможно, что надо закрыть первую (первый открытый документ).
Вообще говоря, на каждый рекордсет нужно открывать по две (а еще лучше - по три) коннекции. Соответственно возрастает количество дополнительных вложенных блокировок. И значительно меньше сбоев из-за проблем со связью
если открывать несколько соннекшинов не замедлит ли работу сервера в целом, если 50 юзеров да по 5 конектов уже 250!!!!
Есть вариант отслеживания какой документ открыт с помощью создания #tmp таблици с ID записей открытых для редактирования, насколько это хорошо?
Alex Hazov
Дата: 16.12.2002 18:39:24
Есть вариант отслеживания какой документ открыт с помощью создания #tmp таблици с ID записей открытых для редактирования, насколько это хорошо?
Тогда возможна ситуация, что в случае некорректного завершения сессии клиента записи могут остаться заблокироваными. Я бы в таком случае записывыл в эту таблицу время блокировки и отслеживал expiration. Или может как то привязаться к Session ID ???
Петр
Дата: 17.12.2002 13:39:00
Привязаться можно, но от куда, если клиент умер, то сесию можно закрыть только с сервера. Хотя по идее сервер должен откатить не закрытые транзакии, т.к. connection разорван.
KirillovA
Дата: 17.12.2002 13:58:41
Петр - Glory уже миллиард раз вклинивался в обсуждение - блин - как в форуме делфей опять людям глову морочишь!
ну поищи ты по форумам - найдешь ответ - этот вопрос миллиары раз уже обсуждался!