27.08.2008, 09:35 | #1 |
Участник
|
Как правильно обновить.
Есть такая ситуация конструкция расположения ttsbegin\ttscommit.
X++: static void Job21(Args _args) { InventTable inventTable; ; inventTable = InventTable::find("какая-нибудь", true); ttsbegin; //inventTable = InventTable::findRecId(inventTable.recId, true); //inventTable.reread(); inventTable.update(); ttscommit; } Есть два выхода или перефайньдить или сделать reread. Повремени выходит одинаково. Вопрос может есть какие-нибудь структуры в Axapt-e которые позволят избежать перечтения. Или может у кого есть какие-предложения как наиболее экономно это сделать? |
|
27.08.2008, 09:55 | #2 |
Moderator
|
Перед update() вызовите inventTable.skipTTSCheck(true);
__________________
Андрей. |
|
|
За это сообщение автора поблагодарили: miklenew (5). |
27.08.2008, 09:57 | #3 |
Злыдни
|
Странные вещи творятся.
На этот код система не ругается. Т.е. если мы сначала селектим, а потом открываем транзакцию, все нормально отрабатывает и даже обновляет. Вот если true поменять на false - да, тогда ругнется. Непонятно. А если попробовать inventTable.selectForUpdate(true) уже в рамках транзакции поставить, то независимо от того, как мы find делали - все сработает.
__________________
Все может быть и быть все может, все может быть или не быть, но быть того никак не может, чего совсем не может быть. |
|
27.08.2008, 10:44 | #4 |
Участник
|
Цитата:
Сообщение от npokypatop
Странные вещи творятся.
На этот код система не ругается. Т.е. если мы сначала селектим, а потом открываем транзакцию, все нормально отрабатывает и даже обновляет. Вот если true поменять на false - да, тогда ругнется. Непонятно. А если попробовать inventTable.selectForUpdate(true) уже в рамках транзакции поставить, то независимо от того, как мы find делали - все сработает. Хм,странно... У меня ругается. AX 3.0 SP3 |
|
27.08.2008, 10:53 | #5 |
Axapta
|
В 3ке так нельзя было, в 4ке - у меня тоже ошибки не появляется.
|
|
27.08.2008, 10:53 | #6 |
Участник
|
|
|
27.08.2008, 11:21 | #7 |
Axapta
|
Пусть в table, условно, если Field1==true, то должно быть Field2 == 7, а если Field1==false, то Field2 == 8.
Пользователь1: select forupdate table... Пользователь2: select forupdate table... [table.Field1 == true] Пользователь1: if (table.Field1) table.Field2 = 7; else table.Field2 = 8; Пользователь2: table.Field1= false Пользователь2: table.skipTTSCheck(true) Пользователь1: table.skipTTSCheck(true) Пользователь2: table.update(); Пользователь1: table.update(); Результат: table.Field1 == false && Field2 == 7. Так что надо подумать, прежде чем использовать skipTTSCheck. |
|
|
За это сообщение автора поблагодарили: miklenew (2). |
27.08.2008, 11:31 | #8 |
Участник
|
Мне почему-то всегда казалось что select forupdate надо делать внутри транзакции т.к. происходит блокировка записи таблицы. Как поведет себя СУБД в случае обрыва транзакции если блокировка была сделана вне этой транзакции?
|
|
27.08.2008, 11:31 | #9 |
Участник
|
|
|
27.08.2008, 14:56 | #10 |
Участник
|
|
|
|
|