Microsoft MVP성태의 닷넷 이야기
기타: 7. DB 트랜잭션에서 Lock이 걸릴 수 있는 전형적인 예. [링크 복사], [링크+제목 복사],
조회: 21926
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

A beginner’s guide to database deadlock
; https://vladmihalcea.com/database-deadlock/

-----------------------------------------------------------------------

다음은 제가 "microsoft.public.kr.dotnet.asp"에 올렸던 답변 내용입니다.

-----------------------------------------------------------------------

별다른 것 없는 전형적인 패턴이면서도... ^^ 전형적으로 Lock이 걸리는
패턴이군요.

"최우택" 님이 하시려는 것을 해결하는 방법에는 2가지 정도가 얼핏 생각나네요.

1번.
말씀하신 동작은 transTest 테이블에 INSERT를 하는 작업인데, 이런 경우 다른
트랜잭션에서 SELECT가 가능하게 하려면 삽입된 행을 제외한 Row만을 SELECT
하는 구문을 던져야 합니다. 15번 Row를 INSERT 했다면, 다른 트랜잭션에서
SELECT를 하기 위해서는 row < 15와 같은 조건을 주어서 SELECT를 해와야 할
것입니다.

2번.
DirtryRead를 가능하게 해야 합니다.
transTest 테이블에 INSERT를 했는데요. INSERT한 트랜잭션에서 IsolationLevel
을 변경해도 그런 경우에는 소용이 없고요. 다른 트랜잭션(시스템 B)에서
IsolationLevel을 ReadUncommited로 설정해야 합니다. 시스템 B의
트랜잭션에서 실행하는 SELECT는 말 그대로 Dirty한 Read를 하게 되는 거죠.
다른 트랜잭션이 완전히 종료하지 않은 테이블의 행을 가져오니까요.

--
======= .NETXpert ==========
url : http://www.dotnetxpert.com
eml : kevin@dotnetxpert.com
msn: kevin025@magicn.com

MCSD.NET
==========================

"최우택" <anonymous@discussions.microsoft.com> wrote in message
news:05f701c48b30$2285c660$a401280a@phx.gbl...
> 닷넷에서 구축하고 있는 상황은 이렇습니다.
>
> 별다른 것 없는 전형적인 패턴이죠.
>
>
>
> 트랜잭션 시작;
>
> tranTest테이블에 인서트;
>
> 시스템 B에게 데이터 입력을 소켓으로 알림;
>
> if( 시스템 B에서 성공메시지 )
>
> 트랜잭션 커밋;
>
> else
>
> 트랜잭션 롤백;
>
>
>
>
>
> 그런데.. 문제는
>
> 데이터가 입력되었다는 신호를 받은 시스템 B에서는
>
> tranTest테이블을 쿼리한 후 데이터를 처리하여
>
> 성공여부값을 돌려주게 됩니다.
>
>
>
> 제 시스템에서 트랜잭션이 진행되는 동안
>
> tranTest에게 락을 걸어놓게되니까, 시스템 B는 쿼리한후
>
> 락이 풀리지 않아 무한정 기다리게 되고, 결국 데드락이 생겨
>
> 버립니다. 이 때문에 트랜잭션의 레벨을
>
> IsolationLevel.RepeatableRead,
>
> IsolationLevel.ReadUncommitted
>
> 이 두가지로 바꿔가며 테스트해봤지만,
>
> 시스템 B에서 tranTest테이블을 읽지 못하는 것은 여전합니다.
>
>
>
> 트랜잭션이 걸리면 원래 다른 시스템은 아예 접근 못하는건지..
>
> 그건 아닐 것 같은데... 어떻게 해야 하나요?
>
> 시스템 B에서 데이터를 읽을 수 있게 하려면 어떻게 설정해야
> 하나요?
>
>
>
> 아래에 축약된 코드를 첨부합니다.
>
>
>
>
>
> public DbManager dbManager = null;
>
> SqlConnection conn = null;
>
> SqlTransaction tx = null;
>
>
>
> conn = new SqlConnection(
> dbManager.GetConnectString() );
>
> conn.Open();
>
> //MessageBox.Show( dbManager.GetConnectString() );
>
> tx = conn.BeginTransaction(
> IsolationLevel.ReadUncommitted );
>
> cmd = conn.CreateCommand();
>
> cmd.Transaction = tx;
>
> cmd.CommandType = CommandType.Text;
>
> cmd.CommandText = tbxQuery.Text;
>
>
>
> int resultCnt = cmd.ExecuteNonQuery();
>
> Write( resultCnt+" 개의 데이터가 작업되었습니다.");
>
>
>
> if( 시스템 B호출 ){
>
> tx.Commit();
>
> }
>
> else{
>
> tx.RollBack();
>
> }
>
> conn.Close();
>









[최초 등록일: ]
[최종 수정일: 6/21/2023]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 181  182  183  184  185  186  187  188  189  190  191  192  193  194  [195]  ...
NoWriterDateCnt.TitleFile(s)
63정성태10/3/200422953.NET Framework: 14. Response.Cookies.Clear는 기존 설정된 Cookie 헤더를 삭제하는 것이 아닙니다.
62정성태10/3/200421926기타: 7. DB 트랜잭션에서 Lock이 걸릴 수 있는 전형적인 예.
61정성태10/3/200421477.NET Framework: 13. Main 메서드에 붙은 STAThread 의미
60정성태10/3/200420197.NET Framework: 12. IDispatch::GetIDsOfNames 역변환 메서드 작성 힌트 ( DISPID 로 메서드 이름 알아내는 것 )
58정성태10/3/200423316.NET Framework: 11. HttpContext의 간략이해
56정성태10/3/200419817.NET Framework: 10. [.NET 리모팅] 원격개체를 호출한 클라이언트의 연결이 유효한지 판단하는 방법.
55정성태10/3/200420580COM 개체 관련: 11. 내가 생각해 보는 COM의 현재 위치
54정성태8/30/200426258VC++: 10. 내가 생각해 보는 MFC OCX와 ATL DLL에 선택 기준
53정성태11/20/200525616VC++: 9. CFtpFileFind/FtpFileFind가 일부 Unix FTP 서버에서 목록을 제대로 못 가져오는 문제
184정성태11/23/200519274    답변글 VC++: 9.1. FTP 관련 토픽파일 다운로드1
51정성태6/24/200424158VC++: 8. BSTR 메모리 할당 및 해제(MSDN Library 발췌) [1]
50정성태6/16/200417430기타: 6. 1차 데스크톱 컴퓨터 사양
49정성태6/16/200417890기타: 5. 53만 원대 Second PC 마련. ^^
48정성태3/2/200419796.NET Framework: 9. 윈도우즈 발전사를 모아 둔 사이트. [1]
47정성태11/14/200518281VS.NET IDE: 7. 한글 OS에서 Internet Explorer 6.0 with SP1의 UI 언어 바꾸는 방법
45정성태1/26/200417645기타: 4. MCAD 시험
44정성태1/26/200418468VS.NET IDE: 6. 터미널 서비스 포트 변경 ( 서버 및 클라이언트 )
46정성태1/26/200423573    답변글 VS.NET IDE: 6.1. Windows 2003 터미널 서비스 라이센스 서버 없이 접속
114정성태11/14/200515012    답변글 VS.NET IDE: 6.2. [터미널 서버 라이센스] : 활성화 시 오류
43정성태12/23/200318196기타: 3. XP/2003 개인 방화벽 설정파일 다운로드1
40정성태7/23/200321670COM 개체 관련: 10. IE BHO 개체를 개발할 때, 인터넷 익스플로러가 아닌 탐색기에서 활성화 되는 문제 해결 [1]
41김성현7/24/200320471    답변글 COM 개체 관련: 10.1. [답변]: IE BHO 개체를 개발할 때, 인터넷 익스플로러가 아닌 탐색기에서 활성화 되는 문제 해결
42정성태7/29/200318361        답변글 COM 개체 관련: 10.2. feedback 을 받기 위해서 답변 기능을 가능하게 해두었습니다.
39정성태7/17/200324123VS.NET IDE: 5. 원격 제어 3가지 방법
38정성태7/17/200320705.NET Framework: 8. IIS 서버 재설치와 ASP.NET 서비스의 문제점
36정성태7/17/200321368.NET Framework: 7. 시행착오 - WebService 참조 추가 오류
... 181  182  183  184  185  186  187  188  189  190  191  192  193  194  [195]  ...