powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
25 сообщений из 78, страница 1 из 4
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32452669
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    Dim rst As New ADODB.Recordset
    Dim sql As String

    sql =  "SELECT * FROM Products Where Id_Product = 1 "
    
    rst.Open sql, cnnAccess, adOpenDynamic, adLockOptimistic
    
    With rst
        .AddNew
            !Id_Customer = Id_Customer
        .Update
    End With
    
    rst.Close
    Set rst = Nothing



После .Update таблица становится недоступна для изменений другим пользоателем, даже после rst.close и Set rst = Nothing
Только когда из программый выйдешь то все ок.

Конекшн используется такой:
cnnAccess.CursorLocation = adUseClient
cnnAccess.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=\\Dom\D\Data\lab.mdb;"

Все добавления делаются в транзакции, так что не понятно зачем блокируется таблица целиком? Ведь добавляемую в транзакции запись не видно, ее никто не изменит. Как отключить блокировку?

Если поставить adopenKeyset - не помогает.
Хелп!!!
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32452871
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поставь в AccessConnection.Mode=16 - ljk;yj dsktxbnm ndj. ,tle


Прим1

Код: plaintext
Все добавления делаются в транзакции
- это про что, про "встроенные транзакции" рассказ? что-то в приведенном тексте никаких транзакций не видно.
Код: plaintext
Ведь добавляемую в транзакции запись не видно, ее никто не изменит
это как бы не совсем верно, если не сказать - совсем неверно.

Прим2 - если тебе не нужно работать с отстоединенными рекордсетами И не нужен RecordCount- не используй фвГыуСдшуте - кроме доп. перегрузки на память и некоторого замедления - другой пользы не получишь. используй adUseClient
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32452874
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в смысле - поставь в AccessConnection.Mode=16 - должно вылечить твою беду
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32452970
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторне используй фвГыуСдшуте
Какой хароший савет, суший! Моя тожи всигда думаль, шта нинада исползувать "фвГыуСдшуте", тока боялась сказать штоб за фуфло ни сойти. Тыж мою мысль своими славами изложил тут прям в Ынтернете. спасиба!

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

PS
пальчы жмакают быстрее, чем глазки смотрют. Правда севодни они и смотрют плохо с утра.
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32453171
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ, я забыл сказать что все эти операции я делаю из VB клиента. Т.е. есть прога на VB из которой идет обращение в базу Access 2000.

Victosha
AccessConnection.Mode=16 это применимо если работать с ADO в Access? А как с VB быть?

Транзакции там есть, просто не стал их описывать, банальные
.BeginTrans
.CommitTrans

авторВедь добавляемую в транзакции запись не видно, ее никто не изменит

это как бы не совсем верно, если не сказать - совсем неверно.
Это еще почему?

авторфвГыуСдшуте
Я весь пол вытер пока ржал ))))

Лифчик
Ты бы помог бы лучше, чем истерику тут разводить :)

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

cnnAccess.CursorLocation = adUseClient

cnnAccess.Mode=16 ' ЭТО НЕ ПРО АКЦЕСС, ЭТО ПРО ADO.CONNECTION

cnnAccess.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=\\Dom\D\Data\lab.mdb;"

вообще история плохо смотрится - нет ли там часом контрола,
который Bound-ed к той же записи и "одновременно" с кодом редактирует ее?

ЗЫ выкладывать часть (вероятно ошибочного) кода не вполне честно вообще, а уж ежели ты ЯВНО транзакции попользовал и скрыл это от населения, то это похоже примерно вот на что. "Мне поставили 2 за сочинение, все что, красным БЫЛО ПОМЕЧЕНО, я вытер - найдите у меня ошибки".

зы2 про adUseServer - исключительно из совета экономить ресурсы (комуктера)

зы3 про то, кто и что видит "в транзакциях", тема совсем отдельная. Прямо ответом является то, что это определяется заказанным Isolation Level-om. а он в руках (твоих).
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32453216
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
зы2 про adUseServer - исключительно из совета экономить ресурсы (комуктера) 
- в смысле компуктера
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32453307
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть такое параметер у ADODB.Connection
"Jet OLEDB:Database Locking Mode"
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
The Jet OLEDB:Database Locking Mode property can be set to any of the following 
values:

Page-level Locking                       0 

Row-level Locking                        1 

Note   A database can only be open in one mode at a time. The first user to open 
the database determines the locking mode to be used while the database is open.
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32454195
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victosha
Можно расписать слегка что есть cnnAccess.Mode=16?
Насчет транзикций, по умолчанию-то их не один юзер не видит ,в смысле добавляемые в транзакции записи, прально?

Senin Viktor
Т.е. по умолчанию Page-level Locking стоит?

А код я не могу полный привести, весь модуль что ли сюда забабахивать?
Основное выглядит так:


Код: 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.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
Public cnnAccess As New ADODB.Connection
 --------------------------------
 
Function Work() as Boolean
Dim Result as Boolean

cnnAccess.CursorLocation = adUseClient
cnnAccess.Open  "Provider=Microsoft.Jet.OLEDB.4 . 0 ;" & _
            "Data Source=\\Dom\D\Data\lab.mdb;"  ' & _


cnnAccess.BeginTrans
Result = AddProduct(Id_Customer, Name)

If Result Then
    cnnAccess.RollbackTrans
    GoTo CancelHandler
End If

cnnAccess.CommitTrans
cnnAccess.Close
Set cnnAccess = Nothing

Exit Sub
CancelHandler:

cnnAccess.Close
Set cnnAccess = Nothing
Work = True
MsgBox "Error"

End Sub
------------------------------
Function AddProduct(Id_Customer as Long, Name as String) as Boolean

    Dim rst As New ADODB.Recordset
    Dim sql As String

    sql = "SELECT * FROM Products Where Id_Product = 1"
    
    rst.Open sql, cnnAccess, adOpenDynamic, adLockOptimistic
    
    With rst
        .AddNew
            !Id_Customer = Id_Customer
            !Name = Name
        .Update
        AddProduct = True
    ' ПОСЛЕ ЭТОГО ВСЯ ТАБЛИЦА БЛОКИРУЕТСЯ ПОКА ИЗ ПРОГИ НЕ ВЫЙДЕШЬ!!!
    End With
    
    rst.Close
    Set rst = Nothing


End Function
 ------------------------------
 


Самое интересное: попробовал испытать на тестовой базе. Создал базу, создал в ней простую таблицу, запустил код - после Update если попытаться редактировать любую запись в таблице Access выдает: <Обновление невозможно; установлена блокировка>
Меняю adOpenDynamic на adOpenKeyset - ура! после Update записи даются редактировать. Пошел заменил в основной базе adOpenDynamic на adOpenKeyset, вроде срабатывает, записи редактируемые после Update, но через некоторое время работы они опять блокируются и каким образом не пойму.
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32454201
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, правки сообщений тут нет что ли?
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32454330
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребят, обнаружилось что все же блокируется не вся таблица, а некоторая ее часть (называется страница?). Уже лучше. Как бы добиться блокировки только одной записи.
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32454525
Фотография Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перейти на MSDE.
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32454536
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Pavel
Перейти на MSDE.

Ну и там страничная блокировка есть :)

2Pantalone

Ты пробовла мой совет про Row locking?

Как бы добиться блокировки только одной записи.

в общем - это решает оптимизатор - какой способ блокировки ему выгодней - такой и будет использоваться, что бы ты не написал и не сделал.

З.Ы.
А индексы (ПримариКей и пр.) есть в Products ?
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32454558
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
16 - это adModeShareDenyNone - открытие базы в режиме "совместного использования".

про открытие в режиме страничной блокировки или на уровне записи написал Senin Viktor

все еще неочивидно, что приведенного кода достаточно, но кое-что вытанцовывается:
на мой взгляд,проблема именно в транзакциях. Детально ОБЪЯСНИТЬ не сумею, а на уроне советов, представляется, что есть 3 пути обхода


1) Выкинуть наружные транзакционные скобки

2) изменить логику, использующую рекордсет - Настоятельно рекомендую открывать рекордсет до явного объявления транзакции по ДОБАВЛЕНИЮ (прим - открывать рекордсет имеешь право в собственных транзакционных скобках, так так для версий до 97 это повышало сетевую юзабельность, освобождая лишние блокировки, накладываемые при отборе записей - потом стали говорить "НЕ НАДО- мол "встроенные транзакции в этом месте хорошо работают"") и закрывать его (рекордсет) ПОСЛЕ Коммита транзакции по добавлению.

3) отказаться от использования рекордсета и перейти к коду типа
dim Result as Long
dim sqlStr as String
sqlStr = "INSERT INTO Products (Id_Customer,Name) VALUES ( " & _
Cstr (Id_Customer) & "," & fmtStr(Name) & ")"

With cnnAccess
.BeginTrans
.ExecInsert SqlStr, Result, adExecuteNoRecords
.Commit
End With


'---------------
Function FmtStr(ByVal vString As String) As String
FmtStr = Replace(vString, "'", "''")
FmtStr = "'" & FmtStr & "'"
End Function
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32454626
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cnnAccess.Mode=16 не помогло.

cnnAccess.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\biblio.mdb;Jet OLEDB:Database Locking Mode=1"
Тоже.

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

---------------
как выкинуть
--------------
Public cnnAccess As New ADODB.Connection
--------------------------------
Function Work() as Boolean
Dim Result as Boolean

cnnAccess.CursorLocation = adUseClient
cnnAccess.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=\\Dom\D\Data\lab.mdb;" ' & _


'cnnAccess.BeginTrans - строчка выкинута

Result = AddProduct(Id_Customer, Name)

'If Result Then - строчка выкинута
' cnnAccess.RollbackTrans - строчка выкинута
' GoTo CancelHandler - строчка выкинута
'End If - строчка выкинута

'cnnAccess.CommitTrans - строчка выкинута

cnnAccess.Close
Set cnnAccess = Nothing

Exit Sub
CancelHandler:

cnnAccess.Close
Set cnnAccess = Nothing
Work = True
MsgBox "Error"

End Sub
------------------------------
Function AddProduct(Id_Customer as Long, Name as String) as Boolean

Dim rst As New ADODB.Recordset
Dim sql As String

sql = "SELECT * FROM Products Where Id_Product = 1"

rst.Open sql, cnnAccess, adOpenDynamic, adLockOptimistic

With rst
.AddNew
!Id_Customer = Id_Customer
!Name = Name
.Update
AddProduct = True
' ПОСЛЕ ЭТОГО ВСЯ ТАБЛИЦА БЛОКИРУЕТСЯ ПОКА ИЗ ПРОГИ НЕ ВЫЙДЕШЬ!!!
End With

rst.Close
Set rst = Nothing


End Function
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32454724
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но я не могу выкинуть транзакцию, у меня добавляется куча товара и если вдруг ошибка где-то или просто юзер решил прервать процесс, то нужен полномаштабный откат всех изменений, иначе будет бардак, сами понимаете.
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32454740
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-)
переходим к пункту 2

ЗЫ - ООой-Ёй-ЁЁй - это што у вас там юзер в транзакции колбасит?

далее почикано
-)
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32454824
Фотография Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отсюда мораль - транзакция должна быть настолько короткой, насколько это возможно.
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455230
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мораль сия меня не устраивает. Да и не правильно это, мне ведь решать какая транзакция будет.
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455242
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пункт 2) окончился провалом, та же фигня, идет блокировка.
Народ, как быть?
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455254
Фотография Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМораль сия меня не устраивает. Да и не правильно это, мне ведь решать какая транзакция будет.
Ну тогда Oracle, IB/FB и иже с ними тебе в руки. Иначе говоря версионники. Там пофигу длина транзакции. А в блокировочных механизмах транзакция должна быть как можно более короткой.
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455258
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
самоцитата:
авторнет ли там часом контрола,
который Bound-ed к той же записи и "одновременно" с кодом редактирует ее?
...
Рейтинг: 0 / 0
25 сообщений из 78, страница 1 из 4
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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