테이블 잠금을 사용하지 않을 경우 table lock on bulk load 옵션이 on으로 설정되지 않으면 기본적으로 행 수준 잠금이 사용됩니다. sp_tableoption을 사용하여 table lock on bulk load 옵션을 설정하면 대량 가져오기 작업을 수행하는 동안 테이블에 대해 잠금 동작이 설정됩니다. sp_tableoption 'dbo.bulkTest’, ‘table lock on bulk load’, ‘ON’; 아니면 아래와 같이 해당 구문 이용 시 힌트를 이용할 수 있습니다. http://msdn.microsoft.com/ko-kr/library/ms180876.aspx |
Database 에서 속성을 클릭했더니… 왠걸 아래와 같은 메세지가 발생 함께 실패하는 군요. Cannot show requested dialog. 보통은 원래 있었던 DBO 로그인이 삭제되어서 발생 하는 문제라고 합니다. USE UserDB |
트레이스 파일 밀어 넣기 이벤트랑 맵핑 해서 내용 보기 |
커넥션 풀링을 사용하는 경우 (커넥션을 Close 한 이후에 사용 하는 경우) 위의 경우 sp_reset_connection 를 통해 이전 연결 설정을 재 사용함을 확인 할 수 있습니다. 커넥션 풀링을 사용하지 않는 경우 아 sp_reset_connection 이 실행 되지 않고 있음을 확인 할 수 있습니다. SPTimeout / Wait Retry 시간 조정 먼저 각 드라이버 별로 SPTimeout 값을 늘려줄 수 도 있습니다. 해당 레지스트리 아래에 SPTimeout 값을 늘려주면 됩니다. Wait Retry 의 경우 이 대기 시간의 전역 설정이라고 볼 수 있습니다. 커넥션 풀링 이용하기 2. OLEDB Driver 의 OLEDB_SERVICES 를 0xffffffff 로 수정합니다. (의미는 아래 표를 참고 합니다.) -- 실제로는 해당 이벤트 확인이 않됩니다. 참고 문서 |
확인해 봤더니 hotfix가 있더군요. - 현상 예 본 예외는 SQL Server 2005 JDBC 드라이버에서 XA 트렌젝션 (오라클에서 지원하는 트렌젝션이죠~~)과 DTC를 동시에 이용할 때 발생하는 예외라고 합니다. [조치 사항] |
* 아직은 많이 부족하기 때문에 제가 자신이 생길 때 까지 본 글은 제 블로그에 대한 링크만 허용합니다. 쓰래드의 백미는 스택입니다. 가끔 우리는 어항과 물고기를 통해 이 프로세스와 쓰래드의 관계를 표현하게 됩니다. 그 경우 이 물고기들은 자신이 해엄치는 자취를 남기게 되는데, 이를 콜 스택이라고 볼 수 있습니다. 다시 말해서 어떠한 일을 한다 즉 함수를 실행 할 때 그 함수 실행의 자취를 콜 스택으로 비유 할 수 있습니다. 우리가 만드는 함수는 아래와 같은 모습이 됩니다.
제가 함수 옆에 숫자를 붙여 놓았는데, 이는 실행 순서 입니다. 여러분도 아시는 것 처럼 이 함수들은 먼저 Main( )이 실행 된 다음 Procedure1( )이 호출 되고, 호출된 Procedure1( ) 이 실행 되고 다시 Procedure2( ) 가 실행되고 다시 Main( )이 실행 됩니다. 이를 위하여 컴퓨터에서는 복귀 주소를 이용하게 되는데, 아래 그림과 같이 먼저 Main( )이 실행 하면 먼저 Main( )의 복귀 주소가 저장이 됩니다. 그리고 Procedure1( )을 호출 하게 되면 스택에 역시 Procedure1 ( )의 복귀 주소가 저장이 되고, 다시 Procedure1 ( )에서 Procedure2 ( )가 호출되게 되면 역시 Procedure 2( )의 복귀 주소가 저장이 되고, 실행 코드가 실행 이 된 후 다시 차례로 자신을 호출했던 복귀 주소로 돌아가 실행 결과를 전달하게 됩니다. 이는 콜 스택이라는 형태로 Thread 상에 표현되게 됩니다. 아래는 사용자가 notepad의 윈도우의 형태를 변경하는 메시지를 입력하는 순간에 잡은 유저 쓰래드입니다. 아래에서 보시는 것 처럼 notepad.exe의 콜 스택에서 81bddcb0 이 실행 중이였습니다. 아 보니깐 대충 “모듈명!함수명”으로 되어 있습니다. 그리고 이 콜 스택을 통해 해당 함수의 로컬 변수 뿐 아니라 매개 변수까지 모두 사용할 수 있습니다. 방법은 간단하죠. 하나의 함수가 선언되어 있다면 해당 함수의 복귀 주소가 저장이 될 것이고 차례로 지정해 놓은 변수들이 해당 스택에 쌓이게 될꺼니깐요. 만약 해당 변수를 매개 변수로 받는 다면 현재의 복귀 주소에서 함수 호출 시 사용한 매개 변수가 있는 위치만큼 위치를 더해서(4K 단위로) 값을 가져 올 수 있습니다. 그래서 이용하는 레지스터가 EBP입니다. ESP는 현재 실행 하고 있는 콜 스택 상의 최 상위 실행 번지 입니다. 문제는 함수가 실행 함에 따라 ESP는 지속적으로 변경이 된다는 거죠. 그렇다면 우리가 사용하는 변수들을 단순위 ESP 값에 번지를 더하는 수준으로는 사용이 어려울 수 있습니다. 그래서 함수가 호출되게 되면 처음에 ESP의 값을 EBP 값으로 변경하고 이 EBP를 기준으로 변수를 접근하게 됩니다. 이렇게 함수들이 실행이 되게 되면 최종적으로는 쌓이다가 다시 꺼내게 되어 있습니다. 이때 사용하는 명령어가 바로 어셈블리어로 Ret 인데, 위의 예제에서는 RetAddr로 표현되고 있습니다. 이 Ret 명령어는 복귀 주소를 ‘Pop’ 즉 꺼내서 ‘Jmp’ 점프 즉 복귀하라는 의미입니다. 스택 트레이싱의 예 제가 간단한 프로그램을 만들어서 해당 프로그램을 통해서 확인 하도록 하겠습니다. #include "stdio.h"
} nt sum(int a, int b)
} int min(int a, int b)
} Windbg를 통해서 해당 실행 파일을 실행 합니다. 해당 함수가 실행 되는 상황에서 콜 스택을 확인 했습니다. 자 그렇다면 이때 무슨일이 일어 나고 있는지 CPU 레지스터 정보를 보겠습니다. 0:000:x86> r DebugTest!sum: 위에서 저는 ESP의 한계로 인해 EBP를 이용한다고 말씀 드렸습니다. 막 스택에 EBP를 넣었군요. 그렇다면 다음에는 ESP의 값을 EBP에 넣어주겠죠? 하지만 지금은 그 단계는 아닙니다. 위에서 현재 실행되고 있는 스택의 주소는 002efdd0 입니다. 0:000:x86> dds esp 자 스택의 ESP 에 있는 010e1414 함수를 확인 하기 위하여 디스어셈블리 해보도록 하겠습니다. 그리고 이전에 설명 드린것과 같이 EBP를 기준으로 하여 로컬 변수 7과 3이 저장하는 것을 볼 수 있습니다. 보시는 것과 같이 자신의 EBP를 기준으로 포인터를 4 8 C… 즉 4 단위로 이동하면서 지정하는 것을 확인 할 수 있습니다. 우리는 레지스터를 통해 현재 실행 중인 명령어 라인을 알 수 있습니다. DebugTest!sum: 마지막으로 이 콜 스택은 위에서부터 프래임 0 번부터 프레임 1 2 3 으로 표현이 됩니다. |