|
Блокировка нескольких SQL запросов
|
|||
---|---|---|---|
#18+
Всем здравствуйте! имеется такой код: if is_prescription.time_prescription <> time('00:00:00') then SELECT count() INTO :ll_count FROM dba.prescriptions WHERE pr_time = :is_prescription.time_prescription AND pr_date = :is_prescription.date_prescription AND pru_id = :is_prescription.id_doctor; if ll_count > 0 then MessageBox('Внимание!', 'По данным параметрам уже есть назначение.~nПовторите поиск назначения'); return -1; end if //проверка назначений SELECT count() INTO :ll_count FROM dba.results, dba.ak_list WHERE dba.results.ak_list_id = dba.ak_list.ak_list_id AND dba.results.pr_time = :is_prescription.time_prescription AND dba.ak_list."date" = :is_prescription.date_prescription AND dba.results.pru_id = :is_prescription.id_doctor; if ll_count > 0 then MessageBox('Внимание!', 'По данным параметрам уже есть назначение.~nПовторите поиск назначения'); return -1; end if end if SELECT max(pr_id) INTO :ll_pr_id FROM dba.prescriptions; if isNull(ll_pr_id) then ll_pr_id = 0; ll_pr_id++ INSERT INTO dba.prescriptions(pr_id, pr_time, pr_date, pru_id, patient_family, patient_name, patient_middle, patient_birth, diag_in, patient_who_sent, patient_who_sent_num, plan, mp_id, phone) VALUES(:ll_pr_id, :is_prescription.time_prescription, :is_prescription.date_prescription, :is_prescription.id_doctor, :is_prescription.family, :is_prescription.name, :is_prescription.middle, :is_prescription.birth, :is_prescription.diag_in, :is_prescription.who_sent, :is_prescription.who_sent_number, :is_prescription.plan, :is_prescription.id_procedure, :is_prescription.phone); if SQLCA.SQLCode <> 0 then MessageBox("Внимание!", "Ошибка назначения пациента на диагностику~n"+SQLCA.SQLErrText); else MessageBox('Информация', 'Назначение успешно сохранено'); Close(w_find_prescriptions); end if Собственно вопрос: как заблокировать таблицу или БД(Anywhere 9.0.1), чтобы пока выполняются операции от первого SELECT(проверка) до INSERT(вставка записи), другие пользователи не смогли добавить в таблицу строку(или изменить какую-то строку). ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2010, 13:44 |
|
Блокировка нескольких SQL запросов
|
|||
---|---|---|---|
#18+
22.07.2010 14:44, МВА пишет: > Собственно вопрос: как заблокировать таблицу или БД(Anywhere 9.0.1), > чтобы пока выполняются операции от первого SELECT(проверка) до > INSERT(вставка записи), другие пользователи не смогли добавить в таблицу > строку(или изменить какую-то строку) Этого делать не нужно. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2010, 14:05 |
|
Блокировка нескольких SQL запросов
|
|||
---|---|---|---|
#18+
Dim2000, хорошо, но тогда представим ситуацию. Делается запрос на проверку(SELECT), затем какой-то другой пользователь по этим данным делает insert. А мы еще раз делаем insert за этим. И выходит две дублирующие строки. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2010, 14:21 |
|
Блокировка нескольких SQL запросов
|
|||
---|---|---|---|
#18+
22.07.2010 15:21, МВА пишет: > хорошо, но тогда представим ситуацию. Делается запрос на > проверку(SELECT), затем какой-то другой пользователь по этим данным > делает insert. А мы еще раз делаем insert за этим. И выходит две > дублирующие строки. Навесить уникальный индекс религия не позволяет ;)? Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2010, 15:24 |
|
Блокировка нескольких SQL запросов
|
|||
---|---|---|---|
#18+
Dim2000, не религия, а логика. Просто одинаковые строки могут быть. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2010, 15:38 |
|
Блокировка нескольких SQL запросов
|
|||
---|---|---|---|
#18+
Из условия ясно, что если time = 00:00, то таких одинаковых строк может много. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2010, 15:40 |
|
Блокировка нескольких SQL запросов
|
|||
---|---|---|---|
#18+
22.07.2010 16:40, МВА пишет: > Из условия ясно, что если time = 00:00, то таких одинаковых строк может > много. Ты действительно думаешь, что я буду читать код, который ты даже не сподобился никак отформатировать ;)? Тем более что, судя по последнему абзацу, в нём нет совершенно ничего интересного . Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2010, 15:45 |
|
Блокировка нескольких SQL запросов
|
|||
---|---|---|---|
#18+
Dim2000, там прямо в первой же строке написано условие. Я не прошу читать, а привел как пример. Вопрос же написал словами. И спросил про блокировку, а не как индексы и куда вставлять. Про это я давно сам подумал и поставил бы. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2010, 16:00 |
|
Блокировка нескольких SQL запросов
|
|||
---|---|---|---|
#18+
МВА, Это вопрос скорее по Anywhere 9.0.1. Не знаю, есть ли там реализация LOCK TABLE IN EXCLUSIVE MODE. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2010, 16:32 |
|
Блокировка нескольких SQL запросов
|
|||
---|---|---|---|
#18+
Ikir, да вот и я так пытался, но билдер отказывается это делать. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2010, 16:38 |
|
Блокировка нескольких SQL запросов
|
|||
---|---|---|---|
#18+
МВАIkir, да вот и я так пытался, но билдер отказывается это делать. А что говорит? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2010, 16:43 |
|
Блокировка нескольких SQL запросов
|
|||
---|---|---|---|
#18+
Ikir, я писал это в билдере, а он вообще не понимал что я хочу. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2010, 16:46 |
|
Блокировка нескольких SQL запросов
|
|||
---|---|---|---|
#18+
МВАIkir, я писал это в билдере, а он вообще не понимал что я хочу. Напишите через Execute immediate ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2010, 16:47 |
|
Блокировка нескольких SQL запросов
|
|||
---|---|---|---|
#18+
22.07.2010 17:32, Ikir пишет: > Это вопрос скорее по Anywhere 9.0.1. > Не знаю, есть ли там реализация > LOCK TABLE IN EXCLUSIVE MODE. Есть с семёрки, правда, EXCLUSIVE MODE требует DBA Authority. Но стоит ли учить автора писать отстой ;)? Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2010, 16:54 |
|
Блокировка нескольких SQL запросов
|
|||
---|---|---|---|
#18+
Локшин Марк, я написал вот так: EXECUTE IMMEDIATE LOCK TABLE dba.prescriptions IN SHARE MODE. Что не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2010, 17:07 |
|
Блокировка нескольких SQL запросов
|
|||
---|---|---|---|
#18+
МВАЛокшин Марк, я написал вот так: EXECUTE IMMEDIATE LOCK TABLE dba.prescriptions IN SHARE MODE. Что не так? Синтаксис не так. В виде текста надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2010, 17:11 |
|
Блокировка нескольких SQL запросов
|
|||
---|---|---|---|
#18+
МВА я написал вот так: EXECUTE IMMEDIATE LOCK TABLE dba.prescriptions IN SHARE MODE. Что не так? Ну во-первых вам нужна EXCLUSIVE MODE Во-вторых, насколько я помню LOCK TABLE должен указываться только внутри транзакции, то есть BEGIN WORK LOCK TABLE COMMIT или ROLLBACK в третьих какой SQLCODE после этого EXECUTE PS to Дим2000 а за последствия мы не отвечаем ))))) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2010, 17:17 |
|
Блокировка нескольких SQL запросов
|
|||
---|---|---|---|
#18+
22.07.2010 18:17, Ikir пишет: > Во-вторых, насколько я помню LOCK TABLE должен указываться только внутри > транзакции ASA по умолчанию работает в chained mode, т.е. транзакцию явно открывать не нужно. Вряд ли у топикстартера он отключён. > PS to Дим2000 > а за последствия мы не отвечаем ))))) Меня бы за аналогичную идею просто пришибли . Молча. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2010, 17:20 |
|
Блокировка нескольких SQL запросов
|
|||
---|---|---|---|
#18+
Локшин Марк, т.е. вот: EXECUTE IMMEDIATE 'LOCK TABLE dba.prescriptions IN EXCLUSIVE MODE' ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2010, 17:25 |
|
Блокировка нескольких SQL запросов
|
|||
---|---|---|---|
#18+
и Code возвращает 0. Но блокировки не происходит. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2010, 17:27 |
|
Блокировка нескольких SQL запросов
|
|||
---|---|---|---|
#18+
Не знаю есть ли в 9, но в 11 версии есть SELECT ... FOR UPDATE. Если есть, то это может спасти отца русской демократии. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2010, 18:04 |
|
Блокировка нескольких SQL запросов
|
|||
---|---|---|---|
#18+
МВАВсем здравствуйте! имеется такой код: ... Собственно вопрос: как заблокировать таблицу или БД(Anywhere 9.0.1), чтобы пока выполняются операции от первого SELECT(проверка) до INSERT(вставка записи), другие пользователи не смогли добавить в таблицу строку(или изменить какую-то строку). [offtop]Прошу прощения, но все же... Вы, случайно, не здесь работаете? [/offtop] ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2010, 18:44 |
|
Блокировка нескольких SQL запросов
|
|||
---|---|---|---|
#18+
Dim2000 22.07.2010 15:21, МВА пишет: > хорошо, но тогда представим ситуацию. Делается запрос на > проверку(SELECT), затем какой-то другой пользователь по этим данным > делает insert. А мы еще раз делаем insert за этим. И выходит две > дублирующие строки. Навесить уникальный индекс религия не позволяет ;)? МВАDim2000, не религия, а логика. Просто одинаковые строки могут быть . Ну а Вам, что и предлагают, навесить уникальный индекс, на дубляж инсерт не произойдет, а вот обработка ошибки БД по номеру, это уж Ваша реализация. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2010, 23:50 |
|
Блокировка нескольких SQL запросов
|
|||
---|---|---|---|
#18+
PL99, нет, не там. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2010, 11:39 |
|
|
start [/forum/topic.php?fid=15&fpage=24&tid=1335909]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
others: | 299ms |
total: | 452ms |
0 / 0 |