Форум: "Базы";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизКак блокировать таблицу при помощи ADO Найти похожие ветки
← →
Eugene1501 (2010-06-15 16:21) [0]Здравствуйте.
Ситуация в следующем:
1. Есть приложение для работы с базой данных в сети через ADOConnection -> ADOCommand,ADOQuery.
2. База данных - Access.
Необходимо дать возможность приложению заблокировать на время таблицу ххх на запись и чтение так чтобы другие пользователи при обращении к таблице ххх просто ждали пока блокировка будет снята. Что-то типа Exlusive в TTable;
← →
12 © (2010-06-16 13:45) [1]может, что-то типа
begintrans
update table set fld = 1 where 1=1
делаем что-то и
rollbacktrans
или
begintrans, ,
и вообще модификация структуры таблицы,
действия,
откат
← →
Виталий Панасенко(дом) (2010-06-16 18:40) [2]
> 12 © (16.06.10 13:45) [1]
а если в fld не 1, а 2?
мне так кажется, что так д.б.
update table
set fld=fld
а вообще, возможно, есть свои готовые заморочки
← →
12 © (2010-06-17 08:34) [3]
> возможно, есть свои готовые заморочки
99% есть
надо на форумах VB смотреть. Что-то типа Lock table, если память не изменяет
> Виталий Панасенко(дом) (16.06.10 18:40) [2]
>
> а если в fld не 1, а 2?
неважно, потом же rollbacktrans
← →
Eugene1501 (2010-06-18 15:46) [4]
> может, что-то типа
>
> begintrans
> update table set fld = 1 where 1=1
> делаем что-то и
> rollbacktrans
Пока выполняется транзакция другие пользователи могут читать данные из таблицы, такой вариант не подходит (.
← →
Eugene1501 (2010-06-18 15:50) [5]Нужно сделать следующее:
1. Заблокировать таблицу на чтение для других пользователей.
2. Прочитать определенное значение.
3. Записать определенное значение.
4. Разблокировать таблицу.
← →
Anatoly Podgoretsky © (2010-06-18 19:31) [6]> Eugene1501 (18.06.2010 15:50:05) [5]
Заблокировать таблицу и уехать в командировку на пару недель.
← →
sniknik © (2010-06-19 13:04) [7]вот почему как только сделают технологию избавленную от некоторых недостатков, так тут же появляются те кто не представляет себе программирования/логики без этих недостатков?
> Нужно сделать следующее:
почему нельзя сделать вместо этого "следующего" следующее:
> 2. Прочитать определенное значение.
> 3. Записать определенное значение.
???
← →
Palladin © (2010-06-19 17:07) [8]
> sniknik © (19.06.10 13:04) [7]
Ну чего ты придираешься? ) Ну не представляет чудо-программист себе жизни без процедуры Exlusive ) Не понимает что блокировать-то не таблицы надо, а древо данных на уровне корневого объекта )
← →
Anatoly Podgoretsky © (2010-06-19 17:59) [9]Вообще ничего блоумровать не надо, не зато боролись
← →
12 © (2010-06-21 15:21) [10]
> Eugene1501 (18.06.10 15:46) [4]
>
>
> > может, что-то типа
> >
> > begintrans
> > update table set fld = 1 where 1=1
> > делаем что-то и
> > rollbacktrans
>
>
> Пока выполняется транзакция другие пользователи могут читать
> данные из таблицы, такой вариант не подходит (.
а если попробовать update структуры?
(например, имя поля переименовать)
← →
sniknik © (2010-06-21 19:34) [11]не получится, т.к. "помощи ADO" ([0]), а он ориентирован на запросы. вот если бы не это ограничение то можно было посмотреть на методы ADOX/jet/jro там глядишь и нашлось бы что-то блокирующее таблицу... т.к. они могут работать непосредственно с обьектами. ну и тогда о запросах пришлось бы забыть, только табличные методы.
← →
Eugene1501 (2010-06-23 18:02) [12]Ладно, может подскажете как организовать следующее:
Есть таблица "Документы" - ключевое поле "Id". Максимальное значение поля "Id" я храню в таблице "wtId". При добавление нового документа, открываю таблицу wtId, читаю значение Id, увеличиваю на единицу и записываю новое значение Id, которое использую при добавлении документа в таблицу "Документы". Такой вот механизм формирования значения ключа. Все хорошо до тех пор, пока не начинается работа в сети нескольких пользователей. Бывают ситуации, что разные пользователи одновременно формируют этот уникальный ключ и получают одинаковые значения, при записи документа естественно происходит ошибка. Как с этим бороться?
← →
Anatoly Podgoretsky © (2010-06-23 20:23) [13]> Eugene1501 (23.06.2010 18:02:12) [12]
База у тебя есть?
← →
sniknik © (2010-06-24 07:51) [14]нужно не с этим, само изобретенным велосипедом, бороться, а сделать нормальную структуру таблицы с автоинкрементным id.
и вообще, не выдумывать своего, кривого, пока не изучишь что для этого есть уже, стандартное.
← →
Eugene1501 (2010-06-24 13:47) [15]
> База у тебя есть?
Есть.
← →
Eugene1501 (2010-06-24 13:50) [16]
> нужно не с этим, само изобретенным велосипедом, бороться,
> а сделать нормальную структуру таблицы с автоинкрементным
> id.
> и вообще, не выдумывать своего, кривого, пока не изучишь
> что для этого есть уже, стандартное.
То есть, я так понимаю для формирования уникального ключа можно использовать только автоинкрементные поля?
А как быть в том случае, если мне нужно получить значение ключевого поля для только что вставленной записи? Причем ключевое поле, назовем его Id, единственный уникальный идентификатор записи таблицы.
← →
Anatoly Podgoretsky © (2010-06-24 15:13) [17]
> > База у тебя есть?
>
> Есть.
Ну так и пользуйся ее возможностями.
← →
12 © (2010-06-24 15:21) [18]http://support.microsoft.com/kb/815629
← →
sniknik © (2010-06-24 15:28) [19]> То есть, я так понимаю для формирования уникального ключа можно использовать только автоинкрементные поля?
неправильно. это просто простой способ. один из. еще можно пользоваться естественными ключами, или гуидами.
← →
sniknik © (2010-06-24 15:31) [20]даже твой способ с отдельной таблицей и значением из нее можно использовать, просто "довести до ума", чтобы не было промежутком между получением и записью нового значения.
хотя этот я бы крайне не рекомендовал.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.066 c