Выполнение SQLCommand, не указывая Транзакцию

Большинство ответов здесь ошибочны или, по крайней мере, устарели. Нет причин, по которым javascript должен быть однопоточным, и на самом деле это не так. Сегодня все основные браузеры поддерживают рабочих, до этого другие среды исполнения javascript, такие как Rhino и Node.js, поддерживали многопоточность.

«Javascript является однопоточным» не является правильным ответом. Например, выполнение функции сна внутри рабочего не блокирует какой-либо код, выполняемый в потоке пользовательского интерфейса.

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

// This is based on the latest ES6 drafts.
// js 1.7+ (SpiderMonkey/Firefox 2+) syntax is slightly different

// run code you want to sleep here (ommit star if using js 1.7)
function* main(){
    for (var i = 0; i < 10; i++) {
        // to sleep for 10 milliseconds 10 times in a row
        yield 10;
    }

    yield 5;
    console.log('I just slept 5 milliseconds!');
}

// resume the given generator after ms milliseconds
function resume(ms, generator){
    setTimeout(function(){
        // ommit .value if using js 1.7
        var nextSleep = generator.next().value;
        resume(nextSleep, generator);
    }, ms);
}

// initialize generator and get first sleep for recursive function
var
    generator = main(),
    firstSleep = generator.next().value;

// initialize recursive resume function
resume(firstSleep, generator);

Эта имитация сна отличается от истинной функции сна, поскольку она не заблокировать поток. Это просто сахар поверх текущей функции javascript setTimeout. Этот тип функциональности был реализован в Task.js и должен работать сегодня в Firefox.

5
задан Cœur 29 January 2018 в 06:04
поделиться

2 ответа

SQL Server может нормально работать без явной транзакции. Но да, я считаю, что он, по сути, фиксируется на чтение (если, конечно, вы не добавляете дополнительные подсказки к своим объектам запроса, например UPDLOCK / NOLOCK ). Вы можете исследовать это с помощью:

DBCC USEROPTIONS

, который показывает (среди прочего):

isolation level read committed
3
ответ дан 13 December 2019 в 22:14
поделиться

SQL неявно создает транзакцию для ваших операторов, и эта транзакция фиксируется, когда оператор завершается. Уровень изоляции этой транзакции будет текущим уровнем изоляции, который по умолчанию имеет значение READ COMMITTED. Некоторые операторы перезаписывают текущий уровень изоляции и обеспечивают выполнение READ COMMITTED (например, RECEIVE).

Если ваша SqlCommand выполняет пакет (больше операторов), тогда каждый оператор, обращающийся к таблицам, создаст свою собственную транзакцию.

По умолчанию автоматическая фиксация транзакций управляется изменением SET IMPLICIT_TRANSACTION ON.

Подробнее см. Управление транзакциями .

7
ответ дан 13 December 2019 в 22:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: