Ответ 1
SaveChanges
использует реализацию DbTransaction
для текущего поставщика хранилища. Это означает, что уровень изоляции транзакции по умолчанию установлен на значение по умолчанию для сервера базы данных. В SQL Server это READ COMMITTED
. Если вы хотите изменить уровень изоляции, вы можете использовать TransactionScope
. Вы также можете переопределить SaveChanges
в производном контексте и перенести base.SaveChanges()
в область действия непосредственно в режиме переопределения.
public override void SaveChanges()
{
// Default isolation level for TransactionScope is Serializable
using (var scope = new TransactionScope())
{
base.SaveChanges();
scope.Complete();
}
}
Вы также можете улучшить этот код, чтобы вы могли пройти уровень изоляции до SaveChanges
и т.д. После того, как вы начнете изменять уровни изоляции, вы должны делать это последовательно. Это означает, что вы должны определять уровень изоляции каждый раз, когда хотите выполнить транзакцию, потому что уровень изоляции настроен для каждого подключения, и соединения используются повторно при использовании пула соединений.
Изменить: Уровень транзакции по умолчанию в EF6 изменился на READ COMMITTED SNAPSHOT