2017-03-07 1 views
0

부분적으로 트랜잭션을 커밋하는 방법이 있는지 알고 싶습니다. 나는 C#에서 오랫동안 실행중인 트랜잭션을 가지고 있는데, 두 명의 사용자가이 트랜잭션을 서로 평행하게 실행하면 데이터는 상호 의존적이며 트랜잭션 중에도 항상 표시되어야합니다. 예를 들어,이 3 개의 열이있는 표가 있다고 가정하십시오.MySQL 트랜잭션을 부분적으로 커밋 하시겠습니까?

사용자 이름 | left_child | right_child

저는 이진 트리를 만들고 있습니다. 그리고 새로운 사용자가 데이터베이스에 추가 될 때마다 트리 어딘가에서 끝납니다. 하지만 하나의 트랜잭션에서 모든 삽입 및 업데이트를 실행하므로 하나의 오류가 있어도 전체 트랜잭션을 롤백 할 수 있고 트리 구조가 방해받지 않습니다. 하지만 문제는 두 명의 사용자가 동시에 내 웹 앱을 사용하는 경우입니다. 사용자 이름 'jackie_'에 분당 아이들이 없다고합시다. 두 명의 새로운 사용자 'king_'과 'robbo'가 서로 병렬로 입력되고 두 사람 모두에 대해 트랜잭션이 실행 중입니다. 한 사용자에 대해 실행중인 트랜잭션 결과가 아직 실제 데이터베이스의 다른 사용자에게 표시되지 않기 때문에 'jackie_'의 left_child가 아직 설정되지 않았다고 생각하므로 둘 다 left_child를 자신의 사용자 이름으로 업데이트합니다 . 업데이트가 두 제품 모두에 성공적 이었기 때문에 트랜잭션이 진행되는 동안 둘 다 트랜잭션을 커밋합니다. 이제 두 명의 사용자가 있지만 그 중 하나만 실제로 실제로 트리에 입력되고 트리의 구조가 완전히 방해받습니다.

그래서 내가 필요로하는 것은 "부분적으로"도 트랜잭션 하나를 저지 할 수 있다는 것입니다. 따라서 'robbo'가 'jackie_'의 left_child를 먼저 설정하면 트랜잭션은 데이터베이스에 변경 사항을 구현하므로 'king_'이 동일한 행을 업데이트하려고 할 때 그는 변경할 수 없습니다. 그러나 길을 따라 가면서 'robbo'에 대해 다른 문제가 발생하면 전체 트랜잭션을 롤백 할 수 있기를 원합니다. 더 실용적 일 수있는 다른 솔루션도 좋습니다. 내가 실행하고 모든 쿼리에 대한

이 내가 트랜잭션에 그 일을하고있는 방법입니다 sqlTrans 그들에게

을 실행하기 전에 나는 모든 MySqlCommand 개체를 사용하고 거래를하다

 string insertTreesQuery = "INSERT INTO tree (username) VALUES('king_')"; 
     MySqlCommand insertTreesQueryCmd = new MySqlCommand(insertTreesQuery , con); 
     insertTreesQueryCmd.Transaction = sqlTrans; 
     insertTreesQueryCmd.ExecuteNonQuery(); 

+1

아니요.이 작업을 수행 할 수 없습니다. 이 문제를 해결하려면 다른 방법을 찾아야합니다. –

답변

1

당신이 묻는 것은 불가능합니다. 트랜잭션을 "부분적으로"커밋 할 수 없습니다. 트랜잭션이 매우 큽니다 언급 한 이후 귀하의 예제를 크게 단순화 가정합니다. 이 경우, 독립적으로 커밋 될 수있는 작은 것들로 분할하는 것이 가장 좋을 것이므로 충돌이 발생할 가능성을 줄입니다.

+0

나는 여러개의 작은 것들로 거래를 나누었고 내 문제를 해결했다. 그것은 단지 충돌의 가능성을 줄 였지만 트리가 더 커지고 더 확장되면 트리 노드가 완전한 트리가되어야하므로 각 노드에서 더 많은 시간이 걸리는 미래의 충돌이 여전히 가능합니다. 그러나 여전히 현재의 문제를 해결했으며 갈등 가능성을 줄이기 위해 더 많은 조정을 할 수 있습니다. 감사합니다. –

관련 문제