2016-06-15 3 views
1

트랜잭션 내부에서 저장 프로 시저 (sp_update_queue)의 업데이트 T-SQL을 래핑해야하는 경우가 있습니다. 하지만 두 스레드가 동일한 연결을 사용하지만 다른 쿼리를 실행하고 시작한 트랜잭션을 롤백하는 경우 어떤 일이 발생하는지 궁금합니다. T-SQL 저장 프로 시저 트랜잭션 동시성

예를 들어 ThreadA 테이블 QUEUED_TASKS을 업데이트 sp_update_queue라고하지만 sp_update_queue이/롤백을 커밋하기 전에 트랜잭션 ThreadB는 다른 업데이 트를 실행하거나 다른 테이블에 SQL 삽입, CUSTOMERS을 말한다. 그런 다음 ThreadB가 끝나면 sp_update_queue에 오류가 발생하여 롤백을 호출합니다.

둘 다 동일한 연결을 사용하기 때문에 롤백은 ThreadB가 트랜잭션 내에서 변경을했는지 여부에 관계없이 ThreadB?가 변경 한 내용을 롤백합니다.

+1

사이드 참고 : ** ** 당신의 저장 프로 시저의'sp_' 접두사를 사용하지 말아야합니다. Microsoft는 [자체 저장을 위해이 접두어를 예약했습니다 (* 저장 프로 시저 명명 * 참조)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx) 및 당신은 미래에 언젠가 이름 충돌의 위험을 감수해야합니다. [저장 프로 시저 성능에 좋지 않습니다.] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). 'sp_'를 피하고 다른 것을 접두어로 사용하는 것이 가장 좋습니다. –

+0

각각의 "스레드"에서'select @@ spid '. –

+0

"... 둘 다 같은 연결을 사용하고 있습니다 ..."라고 말할 때 무슨 뜻인지 분명히 할 수 있습니까? –

답변

0

리소스를 먼저 획득하는 각 스레드는 적절한 격리 수준이있는 경우 해당 리소스를 잠그므로 두 번째 스레드가 필요한 리소스를 기다립니다.

참고 : 각 스레드마다 자체 SessionId가 있습니다.

은 (ThreadA이 테이블 X를 처리하고 ThreadB 테이블 Y 다루고 있습니다) 그러나 스레드 모두 같은 연결을 사용하여 시나리오에서는

업데이트, 그러나 어떤 공통 자원을 사용하지 마십시오. 그래서 각 스레드 (스레드 A 또는 B)의 커밋 또는 롤백은 다른 스레드에 영향을주지 않습니다.

Read more about Isolation Level

+0

sp_update_queue는 QUEUED_TASKS라는 테이블을 업데이트하지만 ThreadB가 다른 테이블 (Customers)을 업데이트 중이므로 기다릴 필요가 없다고 가정합니다. 이 경우 어떻게됩니까? 시나리오를 명확히하기 위해 내 게시물을 업데이트했습니다. –