Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись. / 25 сообщений из 78, страница 1 из 4
23.03.2004, 11:27
    #32452669
Pantalone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
Код: 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
23.03.2004, 12:41
    #32452871
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
поставь в AccessConnection.Mode=16 - ljk;yj dsktxbnm ndj. ,tle


Прим1

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

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

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

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

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

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

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

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

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

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

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

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
23.03.2004, 15:05
    #32453216
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
Код: plaintext
зы2 про adUseServer - исключительно из совета экономить ресурсы (комуктера) 
- в смысле компуктера
...
Рейтинг: 0 / 0
23.03.2004, 15:41
    #32453307
Senin Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
есть такое параметер у 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
24.03.2004, 09:58
    #32454195
Pantalone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
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
24.03.2004, 10:00
    #32454201
Pantalone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
Блин, правки сообщений тут нет что ли?
...
Рейтинг: 0 / 0
24.03.2004, 10:48
    #32454330
Pantalone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
Ребят, обнаружилось что все же блокируется не вся таблица, а некоторая ее часть (называется страница?). Уже лучше. Как бы добиться блокировки только одной записи.
...
Рейтинг: 0 / 0
24.03.2004, 12:07
    #32454525
Pavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
Перейти на MSDE.
...
Рейтинг: 0 / 0
24.03.2004, 12:12
    #32454536
Senin Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
2Pavel
Перейти на MSDE.

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

2Pantalone

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

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

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

З.Ы.
А индексы (ПримариКей и пр.) есть в Products ?
...
Рейтинг: 0 / 0
24.03.2004, 12:18
    #32454558
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
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
24.03.2004, 12:39
    #32454626
Pantalone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
cnnAccess.Mode=16 не помогло.

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

Что такое авторнаружные транзакционные скобки и как их выкинуть?
...
Рейтинг: 0 / 0
24.03.2004, 13:03
    #32454689
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
вкралась очепятка
имелось ввиду
.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
24.03.2004, 13:20
    #32454724
Pantalone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
Но я не могу выкинуть транзакцию, у меня добавляется куча товара и если вдруг ошибка где-то или просто юзер решил прервать процесс, то нужен полномаштабный откат всех изменений, иначе будет бардак, сами понимаете.
...
Рейтинг: 0 / 0
24.03.2004, 13:27
    #32454740
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
-)
переходим к пункту 2

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

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


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