TransactionScope() в Sql Azure
Поддерживает ли Sql Azure использование TransactionScope() при выполнении вставок? Ниже приведен фрагмент кода того, что я пытаюсь сделать.
using (var tx = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions() { IsolationLevel = IsolationLevel.ReadCommitted }))
{
using (var db = MyDataContext.GetDataContext())
{
try
{
MyObject myObject = new MyObject()
{
SomeString = "Monday"
};
db.MyObjects.InsertOnSubmit(myObject);
db.SubmitChanges();
tx.Complete();
}
catch (Exception e)
{
}
}
}
2 ответа
Быстрое обновление распределенных транзакций с базой данных SQL Azure. Несколько дней назад мы представили поддержку распределенных транзакций в базе данных SQL Azure. Функция, которая освещает возможность, называется эластичными транзакциями базы данных. Основное внимание уделяется сценариям с использованием API-интерфейсов распределенных транзакций.NET, таких как TransactionScope. Эти API-интерфейсы начинают работать с базой данных SQL Azure после установки нового выпуска 4.6.1.NET Framework. Вы можете найти больше информации о том, как начать работу здесь: https://azure.microsoft.com/en-us/documentation/articles/sql-database-elastic-transactions-overview/.
Пожалуйста, попробуйте!
Насколько я понимаю, это работает в случае, когда объем транзакции привязан только к одному соединению. Часто, потому что это лучшая практика, чтобы открыть соединение поздно и закрыть рано. может быть ситуация, когда область действия охватывает два соединения. Эти сценарии не поддерживаются в sql azure.
Пример того, где это может не сработать; беру пример; Предполагая, что MyDataContext.GetDataContext() возвращает новый экземпляр соединения.
using (var tx = new TransactionScope(TransactionScopeOption.RequiresNew,
new TransactionOptions()
{ IsolationLevel = IsolationLevel.ReadCommitted }
))
{
try{
DoSomething(); //a method with using (var db = MyDataContext.GetDataContext())
DoSomethingElse(); //another method with using (var db = MyDataContext.GetDataContext())
tx.Complete();
}
catch { //Exception handler
}
}
Эти ссылки должны дать вам несколько указателей