2014-09-30 2 views
1

커밋하기 전에 결과를 검사 할 수 있도록 트랜잭션에서 다음 SQL 업데이트 쿼리를 실행하고 있습니다. 그러나, 실행 및 롤백 후, 나는 그것이 이미 커밋을 발견하고 내 데이터는 커밋 성명을 발표하지 않고 변경되었습니다.SQL 트랜잭션 자체 커밋

USE WS_Live 
BEGIN TRAN Test 

UPDATE AF 
SET AF.AdditionalFieldsLookup11 = NULL 

OUTPUT inserted.* 

FROM dbo.Incident AS I 

INNER JOIN dbo.AdditionalFields AS AF 
ON AF.Oid = I.AdditionalFields 

INNER JOIN dbo.AdditionalFieldsLookup11 AS AFL11 
ON AFL11.Oid = AF.AdditionalFieldsLookup11 

WHERE AF.AdditionalFieldsLookup11 IS NOT NULL 

내 문을 올바르게 포맷하고 있었고, 난 중요한 데이터가 손실되지 않았지만, 나는이 내가 미래에 문제가 실행되지 않도록 일어나는 이유를 알고 싶습니다.

답변

2

자동 커밋 모드가 true로 설정된 SQL Server 역할은 기본적으로 true로 설정됩니다.

Here

그것을 해제하는 방법이며, 여기에이 기능에 대한 약간의 추가 세부입니다 :

+0

롤백 할 수 있었던 다른 트랜잭션을 수행했습니다. 왜 어떤 사람들은 다른 사람들보다 일할 수 있습니까? – NonSecwitter

+0

첫 번째 링크에서 내 'BEGIN'이 자동 커밋을 무시해야합니다. 'BEGIN TRANSACTION 문이 명시 적 트랜잭션을 시작하거나 암시 적 트랜잭션 모드가 설정 될 때까지 SQL Server 연결은 자동 커밋 모드로 작동합니다. ' – NonSecwitter

+0

오 기다려 ... 내가 한 일을 알아. SQL 쿼리가 끝날 때'ROLLBACK TRAN Test'를하는 대신에'BEGIN'을'ROLLBACK'으로 대체 했으므로 명령을 추가 한 것처럼 효과적으로 이전 트랜잭션을 롤백 한 다음 전체 쿼리를 실행하기 시작했습니다 'ROLLBACK' 줄 다음에. – NonSecwitter

0

그것은 SQL은 내가 말한 정확히 무엇을하고 있었 밝혀 원래 트랜잭션을 롤백하려고 할 때까지.

USE WS_Live 
ROLLBACK TRAN Test 

UPDATE AF 
SET AF.AdditionalFieldsLookup11 = NULL 

OUTPUT inserted.* 

FROM dbo.Incident AS I 

INNER JOIN dbo.AdditionalFields AS AF 
ON AF.Oid = I.AdditionalFields 

INNER JOIN dbo.AdditionalFieldsLookup11 AS AFL11 
ON AFL11.Oid = AF.AdditionalFieldsLookup11 

WHERE AF.AdditionalFieldsLookup11 IS NOT NULL 

SQL 그때 나는 내 이전 쿼리의 끝에 ROLLBACK TRAN Test을 추가 것처럼 행동하고,

가 추가 쿼리를 추가 대신 내 거래의 끝에 ROLLBACK를 추가, 나는이 같은 ROLLBACK TRAN TestBEGIN TRAN Test 수정 그 끝.

관련 문제