programing tip

LINQ to SQL 트랜잭션을 만드는 방법은 무엇입니까?

itbloger 2020. 11. 15. 11:00
반응형

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

반응형