LINQ to SQL 트랜잭션을 만드는 방법은 무엇입니까?
여러 삽입을 포함하는 코드가 있지만 다른 테이블에 삽입을 완료하기 전에 submitchanges 메서드를 실행해야 ID를 얻을 수 있습니다. 인터넷을 통해 검색했지만 linq에서 SQL로 트랜잭션을 만드는 방법을 찾을 수 없습니다. 트랜잭션이 발생하기를 원하는 코드에 주석을 달았습니다.
var created = false;
try
{
var newCharacter = new Character();
newCharacter.characterName = chracterName;
newCharacter.characterLevel = 1;
newCharacter.characterExperience = 0;
newCharacter.userUsername = userUsername;
newCharacter.characterClassID = ccslst[0].characterClassID;
//Open transaction
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;
//Commit transaction
}
catch (Exception ex)
{
created = false;
//transaction Rollback;
}
return created;
편집 : ydc가 내 데이터 컨텍스트임을 언급하는 것을 잊었습니다.
모든 것을 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;
}
LINQ to SQL을 사용하는 동안 명시 적 트랜잭션 구현을 수행 할 필요가 없습니다. 모든 DB 작업은 기본적으로 트랜잭션에 래핑됩니다.
전의:
AppDataContext db = new AppDataContext();
<In memory operation 1 on db>
<In memory operation 2 on db>
<In memory operation 3 on db>
<In memory operation 4 on db>
db.SubmitChanges();
All operations between db DataContext initialization and db.SubmitChanges() are wrapped around a Database Transaction by .Net ensuring your database to be in consistent and with property integrity maintained across tables.
Read an article By Scott Guthrie here :- http://weblogs.asp.net/scottgu/archive/2007/07/11/linq-to-sql-part-4-updating-our-database.aspx
참고URL : https://stackoverflow.com/questions/755796/how-to-create-a-linq-to-sql-transaction
'programing tip' 카테고리의 다른 글
Java에서 변수를 동기화하거나 잠그는 방법은 무엇입니까? (0) | 2020.11.16 |
---|---|
Django Admin에서 삭제 링크를 비활성화하는 방법 (0) | 2020.11.16 |
Linux 커널 : 시스템 호출 후킹 예제 (0) | 2020.11.15 |
Python 정규식-R 접두사 (0) | 2020.11.15 |
보기를 복제하려면 어떻게합니까? (0) | 2020.11.15 |