Оберните все это в TransactionScope
. Позвоните transaction.Complete()
в точке, где вы хотите совершить. Если код выходит из блока без вызова Complete()
, транзакция будет отменена. Однако, посмотрев на ответ @ s_ruchit и повторно изучив свой код, вы, вероятно, могли бы переписать его так, чтобы он не требовал TransactionScope
. Первый пример использует TransactionScope
с вашим кодом как есть. Второй пример вносит некоторые незначительные изменения, но выполняет ту же цель.
Место, где вам нужно было бы использовать TransactionScope
, - это когда вы читаете значение из базы данных и используете его для установки нового значения для добавляемого объекта. В этом случае транзакция LINQ не будет охватывать первое чтение, а только последующую отправку нового значения. Поскольку вы используете значение из чтения для вычисления нового значения для записи, необходимо, чтобы чтение было заключено в ту же транзакцию, чтобы другой читатель не вычислил то же значение и не устранил ваше изменение. В вашем случае вы только делаете записи, поэтому стандартная транзакция LINQ должна работать.
Пример 1:
var created = false;
using (var transaction = new TransactionScope())
{
try
{
var newCharacter = new Character();
newCharacter.characterName = chracterName;
newCharacter.characterLevel = 1;
newCharacter.characterExperience = 0;
newCharacter.userUsername = userUsername;
newCharacter.characterClassID = ccslst[0].characterClassID;
ydc.Characters.InsertOnSubmit(newCharacter);
ydc.SubmitChanges();
foreach (var ccs in ccslst)
{
var cs = new CharacterStat();
cs.statId = ccs.statID;
cs.statValue = ccs.statValue;
cs.characterID = newCharacter.characterID;
ydc.CharacterStats.InsertOnSubmit(cs);
}
var ccblst = ydc.ClassBodies.Where(cb => cb.characterClassID == newCharacter.characterClassID);
foreach (var ccb in ccblst)
{
var charBody = new CharacterBody();
charBody.bodyId = ccb.bodyId;
charBody.bodyPartId = ccb.bodyPartId;
charBody.characterID = newCharacter.characterID;
ydc.CharacterBodies.InsertOnSubmit(charBody);
}
ydc.SubmitChanges();
created = true;
transaction.Complete();
}
catch (Exception ex)
{
created = false;
}
}
return created;
Пример 2:
try
{
var newCharacter = new Character();
newCharacter.characterName = chracterName;
newCharacter.characterLevel = 1;
newCharacter.characterExperience = 0;
newCharacter.userUsername = userUsername;
newCharacter.characterClassID = ccslst[0].characterClassID;
ydc.Characters.InsertOnSubmit(newCharacter);
foreach (var ccs in ccslst)
{
var cs = new CharacterStat();
cs.statId = ccs.statID;
cs.statValue = ccs.statValue;
newCharacter.CharacterStats.Add(cs);
}
var ccblst = ydc.ClassBodies.Where(cb => cb.characterClassID == newCharacter.characterClassID);
foreach (var ccb in ccblst)
{
var charBody = new CharacterBody();
charBody.bodyId = ccb.bodyId;
charBody.bodyPartId = ccb.bodyPartId;
newCharacter.CharacterBodies.Add(charBody);
}
ydc.SubmitChanges();
created = true;
}
catch (Exception ex)
{
created = false;
}