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 уже миллиард раз вклинивался в обсуждение - блин - как в форуме делфей опять людям глову морочишь!
ну поищи ты по форумам - найдешь ответ - этот вопрос миллиары раз уже обсуждался!