Блокировка записи в таблице
От: Alex Россия  
Дата: 06.12.01 09:57
Оценка:
Привет всем!

!!! СРОЧНО !!!

Я использую ADO. Коннекчусь через ODBC к Access’овской базе данных. Делаю многопользовательскую программу.

Подскажите, плиииз: как мне заблокировать запись в таблице? Желательно блокировка на чтение. И как мне определить потом что она заблокирована?

Смотрел в MSDN. Что я там нашел.

Объект Record -> свойство Mode. Типа можно указать permissions для записи.
Также написано, что объект Record может представлять строку из Recordset. А вот как его получить мне не понятно. Допустим рекордсет открыт. А дальше что делать? Как запись-то заблокировать? Как получить Record объект, который соотвтетствует определенной записи?

Помогите.

Буду благодарен любым крупицам информации!!!
С надеждой, Алексей.
Re: Блокировка записи в таблице
От: TSS Россия http://www.sdl.ru
Дата: 06.12.01 10:05
Оценка:
Здравствуйте Alex, Вы писали:

A>!!! СРОЧНО !!!


A>Я использую ADO. Коннекчусь через ODBC к Access’овской базе данных. Делаю многопользовательскую программу.


A>Подскажите, плиииз: как мне заблокировать запись в таблице? Желательно блокировка на чтение. И как мне определить потом что она заблокирована?


A>Смотрел в MSDN. Что я там нашел.


A>Объект Record -> свойство Mode. Типа можно указать permissions для записи.

A>Также написано, что объект Record может представлять строку из Recordset. А вот как его получить мне не понятно. Допустим рекордсет открыт. А дальше что делать? Как запись-то заблокировать? Как получить Record объект, который соотвтетствует определенной записи?

A>Помогите.


A>Буду благодарен любым крупицам информации!!!


При открытии рекодсета можно установить режим блокировки:
recordset.Open Source, ActiveConnection, CursorType, LockType, Options


Где LockType:
--- cut ---
LockTypeEnum
Specifies the type of lock placed on records during editing.

Constant Value Description
adLockBatchOptimistic Indicates optimistic batch updates. Required for batch update mode.
adLockOptimistic Indicates optimistic locking, record by record. The provider uses optimistic locking, locking records only when you call the Update method.
adLockPessimistic Indicates pessimistic locking, record by record. The provider does what is necessary to ensure successful editing of the records, usually by locking records at the data source immediately after editing.
adLockReadOnly Indicates read-only records. You cannot alter the data.
adLockUnspecified Does not specify a type of lock. For clones, the clone is created with the same lock type as the original.
--- cut ---
Тебе, я думаю, подойдет adLockPessimistic

Также рекомендую посмотреть на свойство IsolationLevel у объекта Connection.
Signed, [TSS] /SDL/
Re[2]: Блокировка записи в таблице
От: Alex Россия  
Дата: 06.12.01 13:16
Оценка:
Спасибо, за отклик, но это я знаю.
LockType – блокирует от записи, а мне нужно от чтения или от того и другого сразу.
У меня структура БД такая, что необходима блокировка одной записи на чтение.
И по какому полю определить заблокирована запись или нет?

Спасибо, может быть еще какие предложения будут?
Re[3]: Блокировка записи в таблице
От: Игорь Вартанов Ниоткуда  
Дата: 06.12.01 15:14
Оценка:
Здравствуйте Alex, Вы писали:

A>Спасибо, за отклик, но это я знаю.

A>LockType – блокирует от записи, а мне нужно от чтения или от того и другого сразу.
A>У меня структура БД такая, что необходима блокировка одной записи на чтение.
A>И по какому полю определить заблокирована запись или нет?

A>Спасибо, может быть еще какие предложения будут?


Будут. Не использовать аксес. А использовать SQL Server, к примеру. Использовать транзакции и не лезть ручками в блокировки.

Выбор средства очень зависит от постановки задачи и возможности прогнозирования ее жизненного цикла. Иногда совершенные поделухи вырастают в ужасных монстров.

P.S. Предваряя возможные возражения: SQL Server'ы бывают разные — начиная от Desktop и заканчивая Enterprise Edition. Начиная от 6.5 и заканчивая двухтысячником.

P.S. А еще бывает всякий там интербейз, и даже, говорят, бесплатный...
---
С уважением,
Игорь
Re: Блокировка записи в таблице
От: dad  
Дата: 12.12.01 08:24
Оценка:
Здравствуйте Alex, Вы писали:

A>Привет всем!


A>!!! СРОЧНО !!!


A>Я использую ADO. Коннекчусь через ODBC к Access’овской базе данных. Делаю многопользовательскую программу.

Не важно, имхо, что ты используешь. Один мой знакомый использовал парадокс таблицы и БДЕ, для блокировок ввел специальное поле в даблице. Т.е. перед чтением делал упреждающую запись — мол эта запись блокирована.. вот такие пироги.
а еще можно вести отдельное файло, в котором все текущие блокировки прописываются. Или тэйбл.
накладные расходы. но это есть издержки файл-серверной архитектуры.
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[2]: Блокировка записи в таблице
От: Alex Россия  
Дата: 12.12.01 08:33
Оценка:
Здравствуйте dad, Вы писали:

dad>Здравствуйте Alex, Вы писали:

dad>Не важно, имхо, что ты используешь...

Да, я так и сделал (добавил поле) в таблице, записи которой надо блокировать. Это по-моему крайний выход, так сказать на крайняк, если вообще ничего не получится. Но... я думал, что у АДО есть стандартные средства блокирования записей. Полистав книжку по Access2000 я нашел, что АДО такую ботву не поддерживает. Еще в MSDN видел объект Record также из библиотеки АДО. Там типа написано, что можно блокировать записи с его помощью, только не понятно как его юзать. Ну да хрен с ним.

Спасибо, что откликнулся.

Алексей.
Re: Блокировка записи в таблице
От: Zakk  
Дата: 28.04.06 08:11
Оценка:
Здравствуйте, Alex, Вы писали:

A>Привет всем!

A>!!! СРОЧНО !!!

A>Я использую ADO. Коннекчусь через ODBC к Access’овской базе данных. Делаю многопользовательскую программу.

A>Подскажите, плиииз: как мне заблокировать запись в таблице? Желательно блокировка на чтение. И как мне определить потом что она заблокирована?
A>Смотрел в MSDN. Что я там нашел.

A>Объект Record -> свойство Mode. Типа можно указать permissions для записи.

A>Также написано, что объект Record может представлять строку из Recordset. А вот как его получить мне не понятно. Допустим рекордсет открыт. А дальше что делать? Как запись-то заблокировать? Как получить Record объект, который соотвтетствует определенной записи?

A>Помогите.


A>Буду благодарен любым крупицам информации!!!

A>С надеждой, Алексей.


Здравствуйте.

У меня подобная проблема.
Я использую MS SQL Server 2000. Есть многопользовательская база. Пользователь открывает для редактирования некую сущность, которая представлена набором записей в разных таблицах, операция редактирования сложная и длительная. При этом необходимо предотвратить возможность доступа к этой сущности другими клиентами.

Есть два варианта решения и оба не годятся.

А.Заворачивать операцию редактирования в транзакцию не подходит, потому как :

1.Операция длительная, ожидает ввода пользователя. У другого клиента запрос затянется надолго, пока база ему ответит, что запись залочена.
2.В процессе редактирования клиент должен иметь возможность делать модификации некоторых других таблиц базы, и эти изменения не должны откатываться с откатом изменений нашей редактируемой сущности. Более того, нужно реализовать возможность редактировать две или более сущностей одновременно и независимо.

Б.Ввести столбец c флагом LOCK в главную таблицу нашей сущности не годится, потому что при внезапном отключении клиента лок остаётся.

Кто ещё что подскажет ? Заранее благодарен.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.