|
07.10.2019, 22:59 | #1 |
Участник
|
Вот пример джоба по работе с разными типами блокировок
X++: static void example(Args _args) { #define.RetryNum(5) void test( ConcurrencyModel _concurrencyModel = ConcurrencyModel::Auto, boolean _readPast = false) { InventTable inventTable; ; try { ttsbegin; inventTable.concurrencyModel(_concurrencyModel); if (_readPast) { inventTable.readPast(_readPast); } select forceliterals inventTable where inventTable.ItemId == "0000001"; inventTable.NameAlias += "1"; inventTable.doupdate(); ttscommit; } catch (exception::UpdateConflict) { if (appl.ttsLevel() == 0) { if (xSession::currentRetryCount() >= #RetryNum) { throw Exception::UpdateConflictNotRecovered; } else { retry; } } else { throw Exception::UpdateConflict; } } } ; test(ConcurrencyModel::Optimistic); test(ConcurrencyModel::Pessimistic); } X++: SELECT A.ITEMID, ... A.RECVERSION,A.RECID FROM INVENTTABLE A WHERE ((DATAAREAID=N'MRC') AND (ITEMID=N'0000001')) X++: UPDATE INVENTTABLE SET NAMEALIAS=?,RECVERSION=?,MODIFIEDDATE=?,MODIFIEDTIME=?,MODIFIEDBY=?
WHERE (((DATAAREAID=?) AND (RECID=?)) AND (RECVERSION=?)) для случая пессимистичной модели будут такие запросы: X++: SELECT A.ITEMID, ... A.RECVERSION,A.RECID FROM INVENTTABLE A WITH( UPDLOCK) WHERE ((DATAAREAID=N'MRC') AND (ITEMID=N'0000001')) X++: UPDATE INVENTTABLE SET NAMEALIAS=?,RECVERSION=?,MODIFIEDDATE=?,MODIFIEDTIME=?,MODIFIEDBY=?
WHERE ((DATAAREAID=?) AND (RECID=?)) Все запросы работают в READ COMMITTED В случае оптимистической модели вероятность блокировок значительно ниже. Проверено на практике. Последний раз редактировалось Logger; 07.10.2019 в 23:07. |
|