|
|
|
Блокировка и триггеры в ASA
|
|||
|---|---|---|---|
|
#18+
Хочу уточнить следующий вопрос. На клиентской машине происходит сохранение кол-ва товара. Для этой транзакции выставлен уровень изоляции 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; (списываем проданное количество с остатков) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2004, 13:23 |
|
||
|
Блокировка и триггеры в ASA
|
|||
|---|---|---|---|
|
#18+
Честно говоря не очень понял вопрос - при чем тут уровни изоляции и update ? Update изначально блокирует обновляемую строку, так что если кто то изменяет кол-во товара, то срабатывает триггер, который апдейтит таблицу остатков, соответствующе в таблице остатков блокируются обновляемые записи, которые разблокируются только после выполнения в сессии COMMIT. Соответствующе пока они блокированы, другие сессии при попытке их обновления в зависимости от настроек замрут на указанный тайм-аут или же возбудят ошибку о невозможности обновления блокированных данных. Это будет так же верным и для читателей с уровнем изоляции READ COMMITED, так что и в возвращаемых в те же отчеты данные будут чистыми. P.S. Насколько я вижу в триггере стоит ON EACH ROW. Наверное с моей точки зрения было бы эффективнее сделать AFTER TRIGGER ON EACH STATEMENT и для обновления остатков написать: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2004, 15:31 |
|
||
|
Блокировка и триггеры в ASA
|
|||
|---|---|---|---|
|
#18+
Значит, пока commit не скажу, любые посягательства на update таблицы промежуточных остатков будут отклонены? Это главное. Про statement конечно дельное замечание, но в моем случае не подходит - на каждую позицию приходится еще кое-какие операции проделывать, поэтому овчинка выделки не стоит, все равно пришлось бы с каждой позицией возиться отдельно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2004, 16:28 |
|
||
|
Блокировка и триггеры в ASA
|
|||
|---|---|---|---|
|
#18+
авторЗначит, пока commit не скажу, любые посягательства на update таблицы промежуточных остатков будут отклонены? Ну не любые, а именно посягательства на заблокированные в другой транзакцией записи. Если будут обновлятся совсем другие товары, то и пусть себе остатки обновляются, раз никому не мешает и ничему не противоречит :) P.S. Правда тут требуется уточнение, что это полностью соотвествует только для ASA 9, где все блокировки идут на уровне позаписных. В предыдущих версиях ASA вполне возможна ситуация, что блокировка остатков одних товаров могла повлечь за собой блокировку целых страниц, а значит и прихватить с собой другие товары. В плане блокировок мне ASA 9 очень нравиться - блокирует ровно столько, сколько надо, экскалация блокировок происходит до уровня страниц и таблицы только в действительно нужные моменты, для особо критичных случаев остался оператор LOCK TABLE, позволяющий заблокировать всю таблицу, иногда такое при тяжелых транзакциях бывает эффективнее :) Ну чем не жизнь, а то начитаешься понимаешь в форуме MSSQL про блокировки и иногда аж дурно делается, как там все запущено - тут делай первичный кластерный, тут не делай, а тут и экскалация с чего то заблокировала всю таблицу, хотя вроде и не должна :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2004, 18:16 |
|
||
|
Блокировка и триггеры в ASA
|
|||
|---|---|---|---|
|
#18+
Лучше уж пускай блокирует с избытком, чем допускать перекос данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2004, 18:44 |
|
||
|
Блокировка и триггеры в ASA
|
|||
|---|---|---|---|
|
#18+
Перекоса данных в блокировочниках не может быть по определению. В версионниках кстати тоже, но другая архитектура работы приводит к другим проблемам. В Сравнении СУБД копья на эту тему ораклисты и сиквельники ломают уже порядочно времени :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2004, 22:37 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=32523847&tid=2014481]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
35ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 11ms |
| total: | 128ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...