powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
25 сообщений из 78, страница 2 из 4
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455270
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для Pavel - мнится, здеся версионник не поможет. Тут глыбь конкретная, версионник в ней не пловец сам по себе. версионнику как и всем остальным рулильщик нужен. тута конкретна на наложение транзакций похоже. а код не показывают.
вот сижу и думаю - кому стыднее должно быть - тому кто спрашивает, или тому, кто отвечает...
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455279
Фотография Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... или в самой постановке задачи допущены серьезные ошибки. Тут не только код, тут весь анамнез нужен с момента заражения.
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455310
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребят, контрола там нет.
Я специально, дабы разобрать что к чему, сделал новый проект с одной лишь кнопкой, в которую запихнул весь код что обсуждается здесь, т.е. код касаемый непосредственно транзакции и добавления через рекордсет. Так что скрывать мне от вас нечего, код содержит не более того что мы обсуждаем здесь. Да и базу для экспериментов я новую создал, пустую. И завел там всего оку таблицу. Могу выслать, можете саби в дебагере посмотреть.
А я лично склоняюсь к выводу что Access не умеет ограничивать блокировки одной записью в транзакциях.

Давайте проверьте, создайте пустую базу, заведите там таблицу с одним полем, набейте десяток записей. И создайте VB проект с формой и кнопкой на ней и поиграйте с кодом и со всем что мне здесь советовали.
Код, вешаемый на кнопку:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
Dim cnnAccess As New ADODB.Connection

Dim rst As New ADODB.Recordset
Dim sql As String

cnnAccess.CursorLocation = adUseClient
cnnAccess.Open  "Provider=Microsoft.Jet.OLEDB.4 . 0 ;" & _
            "Data Source=C:\biblio.mdb;" 

cnnAccess.BeginTrans


    sql =  "SELECT * FROM Authors Where Author = '1'" 
    
    rst.Open sql, cnnAccess, adOpenKeyset, adLockOptimistic
    
    With rst
        .AddNew
            !Author =  "Name" 
        .Update
        ' тут останавливаемся и пытаемся в базе поредактировать все записи.
    End With
    
    rst.Close
    Set rst = Nothing


cnnAccess.CommitTrans

cnnAccess.Close
Set cnnAccess = Nothing

...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455352
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жопа какая-то. Присоединяюсь к Павлу по поводу всего анамнеза (а мне ответили по поводу индексов?)

А елси через Batch?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
Dim cnnAccess As New ADODB.Connection

Dim rst As New ADODB.Recordset
Dim sql As String

cnnAccess.CursorLocation = adUseClient
cnnAccess.Open  "Provider=Microsoft.Jet.OLEDB.4 . 0 ;" & _
            "Data Source=C:\biblio.mdb;" 

cnnAccess.BeginTrans


    sql =  "SELECT [Author] FROM Authors Where 0 = 1 "
    
rst.Open sql, cnnAccess, adOpenKeyset, adLockBatchOptimistic
    
    With rst
        .AddNew
            !Author =  "Name" 

        .UpdateBatch
        ' тут останавливаемся и пытаемся в базе поредактировать все записи.
    End With
    
    rst.Close
    Set rst = Nothing


cnnAccess.CommitTrans

cnnAccess.Close
Set cnnAccess = Nothing
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455374
Фотография Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если SELECT вынеси из транзакции?
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455377
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Через Batch блокировок нет, но и записи не добавляются, после завершения транзакции в таблице сколько было записей, столько и осталось.
Не понял насчет анамнеза, звучит ругательно как-то, я же говорю что выложил весь неработающий код, зачем все модули выкладывать? Или это о другом?

ЗЫ: достал я вас, примите извинения, но горю!!!
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455382
Фотография Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторИли это о другом?
Так точно. Опиши бизнесс-процесс.
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455384
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Через Batch блокировок нет, но и записи не добавляются, после завершения транзакции в таблице сколько было записей, столько и осталось.


Что значит не добавляются? А если ручками вставлять - что будет? Ошибки какие-нибудь есть?

Да тебе уже писали про INSERT - это лучше чем через рекодсеты - но мне до конца разобраться хотца.

И в конце концов ответь: ИНДЕКСЫ ЕСТЬ???
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455385
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adUseServer пробовал
cnnAccess.Mode = 16 пробовал
Jet OLEDB:Database Locking Mode=0 тоже
Jet OLEDB:Database Locking Mode=1 тоже
rst.CacheSize = 1 пробовал
Select и открытие рекордсета выносил за транзакцию
adLockBatchOptimistic и UpdateBatch туда же

Чего бы еще замутить?
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455387
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В тестовой базе индексов нет, щас добавлю и глянем что будет.
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455389
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторSelect и открытие рекордсета выносил за транзакцию
вот это неправда - не было такого

щас попробую "твой код" - жди 5 мин
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455397
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавил ключевое поле, не помогло.
Insert не устраивает потому что (об этом я умолчал, но без этого никак) нужно получить ID добавленной записи сразу после добавления! При Insert такого не могу.
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455399
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторвот это неправда - не было такого
Здесь может я и не говорил, но по совету выше я это уже пробовал, ничего не вышло.
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455419
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А задача простая, импорт информации из внешнего источника в базу. Есть клиенты, заказы. Алгоритм следующий: добавляем обсуждаемым здесь методом клиента в таблицу клиентов, получаем его ID_Client, добавляем товар в товары, получаем его ID_Product, добавляем заказ клиента в таблицу заказов с учетом ID_Client и ID_Product. Вот собственно и все. Но грабли в то что одновременно с импортом, который длится минут 5, операторы набивают вручную заказы и клиентов и соответственно вылазят глюки что запись заблокирована.
Если делать добавления через Insert, то придется вообще блокировать работу отдела, чтобы после Insert через Selectc Max(ID) получить ID товаров и клиентов, если не блокировать, то MAX может оказаться другим (кто-то ввел запись, а я еще не успел свой MAX отселектить). Потому и решил использовать AddNew вместо Insert, думая что добавляемые записи уж никак на работе не скажутся. Но кто же думал что Access будет и тут блокировать страницы.
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455420
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пробую на Борее через батч - все работает - все появляется

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
Dim cnnAccess As New ADODB.Connection

Dim rst As New ADODB.Recordset
Dim sql As String

Sub s()


cnnAccess.CursorLocation = adUseClient
cnnAccess.Open  "Provider=Microsoft.Jet.OLEDB.4 . 0 ;" & _
            "Data Source=C:\Program Files\Microsoft Office\Office\Samples\Борей.mdb;" 

cnnAccess.BeginTrans


    sql =  "SELECT [КодКлиента],Название FROM Клиенты Where 0 = 1 "
    
rst.Open sql, cnnAccess, adOpenKeyset, adLockBatchOptimistic
    
    With rst
        .AddNew
            ![КодКлиента] =  "QWsWQ" 
            ![Название] =  "ddddd" 
        .UpdateBatch
        ' тут останавливаемся и пытаемся в базе поредактировать все записи.
    End With
    
    rst.Close
    Set rst = Nothing


cnnAccess.CommitTrans

cnnAccess.Close
Set cnnAccess = Nothing

End Sub


Пробую по старому через Update - все работает - все добавляется - ничего не блокируется - со всем

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
Sub s()


cnnAccess.CursorLocation = adUseClient
cnnAccess.Open  "Provider=Microsoft.Jet.OLEDB.4 . 0 ;" & _
            "Data Source=C:\Program Files\Microsoft Office\Office\Samples\Борей.mdb;" 

cnnAccess.BeginTrans


    sql =  "SELECT [КодКлиента],Название FROM Клиенты Where 0 = 1 "
    
rst.Open sql, cnnAccess, adOpenKeyset, adLockOptimistic
    
    With rst
        .AddNew
            ![КодКлиента] =  "_йУWQ" 
            ![Название] =  "dddййййd" 
        .Update
        ' тут останавливаемся и пытаемся в базе поредактировать все записи.
    End With
    
    rst.Close
    Set rst = Nothing


cnnAccess.CommitTrans

cnnAccess.Close
Set cnnAccess = Nothing

End Sub
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455422
Фотография Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторInsert не устраивает потому что (об этом я умолчал, но без этого никак) нужно получить ID добавленной записи сразу после добавления! При Insert такого не могу.
@@Identity
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455427
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел, какой @@Identity??? Это Access база!

Виктор, а ты когда после Update стопорнул, т.е. когда транзакция все еще не завершена, открой таблицу и поменяй вручную значения ВСЕХ(!) записей.
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455431
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, батч работает, стормознул немного, в смысле запись добавляется, но сабж по прежнему в силе.
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455433
Фотография Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПавел, какой @@Identity??? Это Access база!
Я понимаю.
А ты попробуй (если у тебя Аcsess 2000 или более поздний).
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455437
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всЕ работает - с индексами и без, со скобками и без, внутри и снаружи и батч и не батч - никаких блокировок.

Единственное - если попутать параметры - типа открыть для батчапдейт а апдейтить .Update - просто молча не добавляет.
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455439
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всЕ работает - с индексами и без, со скобками и без, внутри и снаружи и батч и не батч - никаких блокировок.

Единственное - если попутать параметры - типа открыть для батчапдейт а апдейтить .Update - просто молча не добавляет.
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455452
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виктор, а ты когда после Update стопорнул, т.е. когда транзакция все еще не завершена, открой таблицу и поменяй вручную значения ВСЕХ(!) записей.

Действительно. Если остановить прогу ПОСЛЕ Update.
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455459
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дык не только Клиенты - все таблицы заблокированы
Это из-за конекта
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455460
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavel,
1) если mdb версии >=2000, то @@Identity у него ЕСТЬ
2) Еще раз - приведенный код ничего не блокирует, и , в принципе, честный, хотя свои "советы" оставляю в силе. Проблема НЕ в том коде непосредственно. Что-то утаивается.

Выглядит объяснение твоего рассказа следующим образом:
Есть два процесса А) и Б)

а) открыл транзакцию
а) добавил запись
б) увидел добавленную запись
б) открыл транзакцию (не обязательно)
б) встал на редактирование записи и наложил блокировку

а) закрыл транзакцию
б) висит на записи до закрытия приложения, блокируя ее

ПОЭТОМУ я говорил - ищи контрол.

если это не контрол - то может, - "брошенный" незакрытый рекордсет
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455482
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я понял - мы сражаемся с ветренными мельницами - так и должно быть при добавлении - блокировка всей таблицы на изменение
...
Рейтинг: 0 / 0
25 сообщений из 78, страница 2 из 4
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]