powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Блокировка и триггеры в ASA
6 сообщений из 6, страница 1 из 1
Блокировка и триггеры в ASA
    #32523847
mustlive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу уточнить следующий вопрос.

На клиентской машине происходит сохранение кол-ва товара. Для этой транзакции выставлен уровень изоляции ReadCommitted, запросы идут с
ConcerrencyLevel=WQCLLock (Cursor uses the lowest level of locking sufficient to ensure that the row can be updated)

В таблице, в которую сохраняются данные, есть триггеры на insert,update и delete, которые в свою очередь модифицируют таблицу промежуточных остатков товара.

Внимание, вопрос: распространяются ли уровни блокировки и уровень изоляции на операции в триггерах. Т. е. может ли произойти некорректное обновление таблицы промежуточных остатков? В триггерах используется примерно следующая конструкция:

update dba.commrest set restcnt=restcnt-sendcnt where party=newval.newparty;
(списываем проданное количество с остатков)
...
Рейтинг: 0 / 0
Блокировка и триггеры в ASA
    #32524212
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Честно говоря не очень понял вопрос - при чем тут уровни изоляции и update ? Update изначально блокирует обновляемую строку, так что если кто то изменяет кол-во товара, то срабатывает триггер, который апдейтит таблицу остатков, соответствующе в таблице остатков блокируются обновляемые записи, которые разблокируются только после выполнения в сессии COMMIT. Соответствующе пока они блокированы, другие сессии при попытке их обновления в зависимости от настроек замрут на указанный тайм-аут или же возбудят ошибку о невозможности обновления блокированных данных. Это будет так же верным и для читателей с уровнем изоляции READ COMMITED, так что и в возвращаемых в те же отчеты данные будут чистыми.

P.S. Насколько я вижу в триггере стоит ON EACH ROW. Наверное с моей точки зрения было бы эффективнее сделать AFTER TRIGGER ON EACH STATEMENT и для обновления остатков написать:
Код: plaintext
1.
2.
3.
update dba.commrest c
set restcnt=c.restcnt - i.sendcnt
from dba.commrest c
  inner join inserted i on c.party=i.newparty;
Тогда при обновлении например 100 товаров в Вашем случае будет выполнено 100 операторов update, а в моем случае все равно только один :)
...
Рейтинг: 0 / 0
Блокировка и триггеры в ASA
    #32524386
mustlive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит, пока commit не скажу, любые посягательства на update таблицы промежуточных остатков будут отклонены? Это главное.

Про statement конечно дельное замечание, но в моем случае не подходит - на каждую позицию приходится еще кое-какие операции проделывать, поэтому овчинка выделки не стоит, все равно пришлось бы с каждой позицией возиться отдельно.
...
Рейтинг: 0 / 0
Блокировка и триггеры в ASA
    #32524694
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЗначит, пока commit не скажу, любые посягательства на update таблицы промежуточных остатков будут отклонены?
Ну не любые, а именно посягательства на заблокированные в другой транзакцией записи. Если будут обновлятся совсем другие товары, то и пусть себе остатки обновляются, раз никому не мешает и ничему не противоречит :)

P.S. Правда тут требуется уточнение, что это полностью соотвествует только для ASA 9, где все блокировки идут на уровне позаписных. В предыдущих версиях ASA вполне возможна ситуация, что блокировка остатков одних товаров могла повлечь за собой блокировку целых страниц, а значит и прихватить с собой другие товары. В плане блокировок мне ASA 9 очень нравиться - блокирует ровно столько, сколько надо, экскалация блокировок происходит до уровня страниц и таблицы только в действительно нужные моменты, для особо критичных случаев остался оператор LOCK TABLE, позволяющий заблокировать всю таблицу, иногда такое при тяжелых транзакциях бывает эффективнее :) Ну чем не жизнь, а то начитаешься понимаешь в форуме MSSQL про блокировки и иногда аж дурно делается, как там все запущено - тут делай первичный кластерный, тут не делай, а тут и экскалация с чего то заблокировала всю таблицу, хотя вроде и не должна :)
...
Рейтинг: 0 / 0
Блокировка и триггеры в ASA
    #32524749
mustlive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше уж пускай блокирует с избытком, чем допускать перекос данных.
...
Рейтинг: 0 / 0
Блокировка и триггеры в ASA
    #32524945
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перекоса данных в блокировочниках не может быть по определению. В версионниках кстати тоже, но другая архитектура работы приводит к другим проблемам. В Сравнении СУБД копья на эту тему ораклисты и сиквельники ломают уже порядочно времени :)
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Блокировка и триггеры в ASA
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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