Большинство ответов здесь ошибочны или, по крайней мере, устарели. Нет причин, по которым 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.
SQL Server может нормально работать без явной транзакции. Но да, я считаю, что он, по сути, фиксируется на чтение (если, конечно, вы не добавляете дополнительные подсказки к своим объектам запроса, например UPDLOCK
/ NOLOCK
). Вы можете исследовать это с помощью:
DBCC USEROPTIONS
, который показывает (среди прочего):
isolation level read committed
SQL неявно создает транзакцию для ваших операторов, и эта транзакция фиксируется, когда оператор завершается. Уровень изоляции этой транзакции будет текущим уровнем изоляции, который по умолчанию имеет значение READ COMMITTED. Некоторые операторы перезаписывают текущий уровень изоляции и обеспечивают выполнение READ COMMITTED (например, RECEIVE).
Если ваша SqlCommand выполняет пакет (больше операторов), тогда каждый оператор, обращающийся к таблицам, создаст свою собственную транзакцию.
По умолчанию автоматическая фиксация транзакций управляется изменением SET IMPLICIT_TRANSACTION ON.
Подробнее см. Управление транзакциями .