Конференция "Базы" » Как блокировать таблицу при помощи ADO [D6, MSAccess]
 
  • Eugene1501 (15.06.10 16:21) [0]
    Здравствуйте.

    Ситуация в следующем:
    1. Есть приложение для работы с базой данных в сети через  ADOConnection -> ADOCommand,ADOQuery.
    2. База данных - Access.

    Необходимо дать возможность приложению заблокировать на время таблицу ххх на запись и чтение так чтобы другие пользователи при обращении к таблице ххх просто ждали пока блокировка будет снята. Что-то типа Exlusive в TTable;
  • 12 © (16.06.10 13:45) [1]
    может, что-то типа

    begintrans
    update table set fld = 1 where 1=1
    делаем что-то и
    rollbacktrans

    или
    begintrans, ,
    и вообще модификация структуры таблицы,
    действия,
    откат

  • > 12 ©   (16.06.10 13:45) [1]

    а если в fld не 1, а 2?

    мне так кажется, что так д.б.
    update table
    set fld=fld

    а вообще, возможно, есть свои готовые заморочки
  • 12 © (17.06.10 08:34) [3]

    > возможно, есть свои готовые заморочки

    99% есть
    надо на форумах VB смотреть. Что-то типа Lock table, если память не изменяет


    > Виталий Панасенко(дом)   (16.06.10 18:40) [2]
    >
    > а если в fld не 1, а 2?

    неважно, потом же rollbacktrans
  • Eugene1501 (18.06.10 15:46) [4]

    > может, что-то типа
    >
    > begintrans
    > update table set fld = 1 where 1=1
    > делаем что-то и
    > rollbacktrans


    Пока выполняется транзакция другие пользователи могут читать данные из таблицы, такой вариант не подходит (.
  • Eugene1501 (18.06.10 15:50) [5]
    Нужно сделать следующее:

    1. Заблокировать таблицу на чтение для других пользователей.
    2. Прочитать определенное значение.
    3. Записать определенное значение.
    4. Разблокировать таблицу.
  • Anatoly Podgoretsky © (18.06.10 19:31) [6]
    > Eugene1501  (18.06.2010 15:50:05)  [5]

    Заблокировать таблицу и уехать в командировку на пару недель.
  • sniknik © (19.06.10 13:04) [7]
    вот почему как только сделают технологию избавленную от некоторых недостатков, так тут же появляются те кто не представляет себе программирования/логики без этих недостатков?

    > Нужно сделать следующее:
    почему нельзя сделать вместо этого "следующего" следующее:
    > 2. Прочитать определенное значение.
    > 3. Записать определенное значение.
    ???
  • Palladin © (19.06.10 17:07) [8]

    > sniknik ©   (19.06.10 13:04) [7]

    Ну чего ты придираешься? ) Ну не представляет чудо-программист себе жизни без процедуры Exlusive ) Не понимает что блокировать-то не таблицы надо, а древо данных на уровне корневого объекта )
  • Anatoly Podgoretsky © (19.06.10 17:59) [9]
    Вообще ничего блоумровать не надо, не зато боролись
  • 12 © (21.06.10 15:21) [10]

    > Eugene1501   (18.06.10 15:46) [4]
    >
    >
    > > может, что-то типа
    > >
    > > begintrans
    > > update table set fld = 1 where 1=1
    > > делаем что-то и
    > > rollbacktrans
    >
    >
    > Пока выполняется транзакция другие пользователи могут читать
    > данные из таблицы, такой вариант не подходит (.


    а если попробовать update структуры?
    (например, имя поля переименовать)
  • sniknik © (21.06.10 19:34) [11]
    не получится, т.к. "помощи ADO" ([0]), а он ориентирован на запросы. вот если бы не это ограничение то можно было посмотреть на методы ADOX/jet/jro там глядишь и нашлось бы что-то блокирующее таблицу... т.к. они могут работать непосредственно с обьектами. ну и тогда о запросах пришлось бы забыть, только табличные методы.
  • Eugene1501 (23.06.10 18:02) [12]
    Ладно, может подскажете как организовать следующее:

    Есть таблица "Документы"  - ключевое поле "Id". Максимальное значение поля "Id" я храню в таблице "wtId". При добавление нового документа, открываю таблицу wtId, читаю значение Id, увеличиваю на единицу и записываю новое значение Id, которое использую при добавлении документа в таблицу "Документы". Такой вот механизм формирования значения ключа. Все хорошо до тех пор, пока не начинается работа в сети нескольких пользователей. Бывают ситуации, что разные пользователи одновременно формируют этот уникальный ключ и получают одинаковые значения, при записи документа естественно происходит ошибка. Как с этим бороться?
  • Anatoly Podgoretsky © (23.06.10 20:23) [13]
    > Eugene1501  (23.06.2010 18:02:12)  [12]

    База у тебя есть?
  • sniknik © (24.06.10 07:51) [14]
    нужно не с этим, само изобретенным велосипедом, бороться, а сделать нормальную структуру таблицы с автоинкрементным id.
    и вообще, не выдумывать своего, кривого, пока не изучишь что для этого есть уже, стандартное.
  • Eugene1501 (24.06.10 13:47) [15]

    > База у тебя есть?

    Есть.
  • Eugene1501 (24.06.10 13:50) [16]

    > нужно не с этим, само изобретенным велосипедом, бороться,
    >  а сделать нормальную структуру таблицы с автоинкрементным
    > id.
    > и вообще, не выдумывать своего, кривого, пока не изучишь
    > что для этого есть уже, стандартное.


    То есть, я так понимаю для формирования уникального ключа можно использовать только автоинкрементные поля?

    А как быть в том случае, если мне нужно получить значение ключевого поля для только что вставленной записи? Причем ключевое поле, назовем его Id, единственный уникальный идентификатор записи таблицы.
  • Anatoly Podgoretsky © (24.06.10 15:13) [17]

    > > База у тебя есть?
    >
    > Есть.

    Ну так и пользуйся ее возможностями.
  • 12 © (24.06.10 15:21) [18]
  • sniknik © (24.06.10 15:28) [19]
    > То есть, я так понимаю для формирования уникального ключа можно использовать только автоинкрементные поля?
    неправильно. это просто простой способ. один из. еще можно пользоваться естественными ключами, или гуидами.
  • sniknik © (24.06.10 15:31) [20]
    даже твой способ с отдельной таблицей и значением из нее можно использовать, просто "довести до ума", чтобы не было промежутком между получением и записью нового значения.
    хотя этот я бы крайне не рекомендовал.
 
Конференция "Базы" » Как блокировать таблицу при помощи ADO [D6, MSAccess]
Есть новые Нет новых   [134432   +20][b:0][p:0.001]