|
|
|
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. После .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 - не помогает. Хелп!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2004, 11:27 |
|
||
|
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
|
|||
|---|---|---|---|
|
#18+
поставь в AccessConnection.Mode=16 - ljk;yj dsktxbnm ndj. ,tle Прим1 Код: plaintext Код: plaintext Прим2 - если тебе не нужно работать с отстоединенными рекордсетами И не нужен RecordCount- не используй фвГыуСдшуте - кроме доп. перегрузки на память и некоторого замедления - другой пользы не получишь. используй adUseClient ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2004, 12:41 |
|
||
|
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
|
|||
|---|---|---|---|
|
#18+
в смысле - поставь в AccessConnection.Mode=16 - должно вылечить твою беду ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2004, 12:42 |
|
||
|
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
|
|||
|---|---|---|---|
|
#18+
авторне используй фвГыуСдшуте Какой хароший савет, суший! Моя тожи всигда думаль, шта нинада исползувать "фвГыуСдшуте", тока боялась сказать штоб за фуфло ни сойти. Тыж мою мысль своими славами изложил тут прям в Ынтернете. спасиба! ЗЫ Просто не мог хоть как-то не отметиться в топике у автора с таким ником ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2004, 13:20 |
|
||
|
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
|
|||
|---|---|---|---|
|
#18+
To Лифчик будем считать, что познакомились. -) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2004, 13:25 |
|
||
|
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
|
|||
|---|---|---|---|
|
#18+
а совет был про adUseServer - в смысле его используй. PS пальчы жмакают быстрее, чем глазки смотрют. Правда севодни они и смотрют плохо с утра. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2004, 13:30 |
|
||
|
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
|
|||
|---|---|---|---|
|
#18+
Народ, я забыл сказать что все эти операции я делаю из VB клиента. Т.е. есть прога на VB из которой идет обращение в базу Access 2000. Victosha AccessConnection.Mode=16 это применимо если работать с ADO в Access? А как с VB быть? Транзакции там есть, просто не стал их описывать, банальные .BeginTrans .CommitTrans авторВедь добавляемую в транзакции запись не видно, ее никто не изменит это как бы не совсем верно, если не сказать - совсем неверно. Это еще почему? авторфвГыуСдшуте Я весь пол вытер пока ржал )))) Лифчик Ты бы помог бы лучше, чем истерику тут разводить :) adUseServer использовать не могу, мне нужен RecordCount, но разве из-за adUseServer у меня таблицы блокируются? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2004, 14:48 |
|
||
|
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
|
|||
|---|---|---|---|
|
#18+
это глазки - они ведели, что человекк плакал, а пальцы жмакают по памяти. имелось ввиду следующее 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. а он в руках (твоих). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2004, 15:03 |
|
||
|
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
|
|||
|---|---|---|---|
|
#18+
Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2004, 15:05 |
|
||
|
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
|
|||
|---|---|---|---|
|
#18+
есть такое параметер у ADODB.Connection "Jet OLEDB:Database Locking Mode" Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2004, 15:41 |
|
||
|
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
|
|||
|---|---|---|---|
|
#18+
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. Самое интересное: попробовал испытать на тестовой базе. Создал базу, создал в ней простую таблицу, запустил код - после Update если попытаться редактировать любую запись в таблице Access выдает: <Обновление невозможно; установлена блокировка> Меняю adOpenDynamic на adOpenKeyset - ура! после Update записи даются редактировать. Пошел заменил в основной базе adOpenDynamic на adOpenKeyset, вроде срабатывает, записи редактируемые после Update, но через некоторое время работы они опять блокируются и каким образом не пойму. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2004, 09:58 |
|
||
|
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
|
|||
|---|---|---|---|
|
#18+
Блин, правки сообщений тут нет что ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2004, 10:00 |
|
||
|
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
|
|||
|---|---|---|---|
|
#18+
Ребят, обнаружилось что все же блокируется не вся таблица, а некоторая ее часть (называется страница?). Уже лучше. Как бы добиться блокировки только одной записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2004, 10:48 |
|
||
|
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
|
|||
|---|---|---|---|
|
#18+
Перейти на MSDE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2004, 12:07 |
|
||
|
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
|
|||
|---|---|---|---|
|
#18+
2Pavel Перейти на MSDE. Ну и там страничная блокировка есть :) 2Pantalone Ты пробовла мой совет про Row locking? Как бы добиться блокировки только одной записи. в общем - это решает оптимизатор - какой способ блокировки ему выгодней - такой и будет использоваться, что бы ты не написал и не сделал. З.Ы. А индексы (ПримариКей и пр.) есть в Products ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2004, 12:12 |
|
||
|
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2004, 12:18 |
|
||
|
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
|
|||
|---|---|---|---|
|
#18+
cnnAccess.Mode=16 не помогло. cnnAccess.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\biblio.mdb;Jet OLEDB:Database Locking Mode=1" Тоже. Что такое авторнаружные транзакционные скобки и как их выкинуть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2004, 12:39 |
|
||
|
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
|
|||
|---|---|---|---|
|
#18+
вкралась очепятка имелось ввиду .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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2004, 13:03 |
|
||
|
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
|
|||
|---|---|---|---|
|
#18+
Но я не могу выкинуть транзакцию, у меня добавляется куча товара и если вдруг ошибка где-то или просто юзер решил прервать процесс, то нужен полномаштабный откат всех изменений, иначе будет бардак, сами понимаете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2004, 13:20 |
|
||
|
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
|
|||
|---|---|---|---|
|
#18+
-) переходим к пункту 2 ЗЫ - ООой-Ёй-ЁЁй - это што у вас там юзер в транзакции колбасит? далее почикано -) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2004, 13:27 |
|
||
|
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
|
|||
|---|---|---|---|
|
#18+
Отсюда мораль - транзакция должна быть настолько короткой, насколько это возможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2004, 13:54 |
|
||
|
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
|
|||
|---|---|---|---|
|
#18+
Мораль сия меня не устраивает. Да и не правильно это, мне ведь решать какая транзакция будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2004, 16:07 |
|
||
|
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
|
|||
|---|---|---|---|
|
#18+
Пункт 2) окончился провалом, та же фигня, идет блокировка. Народ, как быть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2004, 16:13 |
|
||
|
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
|
|||
|---|---|---|---|
|
#18+
авторМораль сия меня не устраивает. Да и не правильно это, мне ведь решать какая транзакция будет. Ну тогда Oracle, IB/FB и иже с ними тебе в руки. Иначе говоря версионники. Там пофигу длина транзакции. А в блокировочных механизмах транзакция должна быть как можно более короткой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2004, 16:17 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32454724&tid=1675750]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
150ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
| others: | 200ms |
| total: | 435ms |

| 0 / 0 |
