Решил зафиксировать результаты небольших опытов, проведенных на приложениях Ax3sp3 и Ax4sp2 подключенных к серверу MS SQL2005 с БД в режиме 90.
В опытах принимают участие: табличка
aTable с полями
Id - int с уникальным индексом
Value - int без индекса
и 2 жобика
X++:
static void Job_b1(Args _args)
{
aTable aTable;
;
ttsbegin;
aTable = aTable::find(12, true); // такая запись есть
aTable.Value = timenow();
aTable.update();
ttscommit;
}
static void Job_b2(Args _args)
{
aTable aTable;
;
select aTable
where aTable.Value == 200; // такой записи нет
ttsbegin;
select aTable
where aTable.Value == 200;
aTable = aTable::find(12, true);
aTable.Value = timenow();
aTable.update();
ttscommit;
}
Опыт 1
Запускаем 2 клиента аксапты.
В одном из них ставим точку останова на строке
aTable.update(); первого джобика и выполняем.
Во втором выполняем джобик2 по шагам.
Ax3sp3 - джобик2 вешается на строке
aTable = aTable::find(12, true); до тех пор пока не закончится джоб1.
Ax4sp2 - джоб2 отрабатывает до конца, однако при попытки продолжить джоб1 получаем ошибку:
Невозможно отредактировать запись в aTable (aTable).
Возник конфликт обновления из-за того, что другой пользовательский процесс выполняет удаление записи или изменение одного или нескольких полей в записи.
Опыт 2
Запускаем 2 клиента аксапты.
В одном из них ставим точку останова на строке
ttscommit; первого джобика и выполняем.
Во втором выполняем джобик2 по шагам.
Ax3sp3 - на этот раз джобик2 вешается на строке
select aTable where aTable.Value == 200; (
которая после ttsbegin) до тех пор пока не закончится джоб1.
Ax4sp2 - теперь и здесь джоб2 вешается, но на строке
aTable.update(); до тех пор пока не закончится джоб1, а потом выдает туже ошибку:
Невозможно отредактировать запись в aTable (aTable).
Возник конфликт обновления из-за того, что другой пользовательский процесс выполняет удаление записи или изменение одного или нескольких полей в записи.