2016-11-13 2 views
1

나는이 트랜잭션 (내 첫 번째 거래)을 만들었고, 테이블에 Id = 111이라는 행이 없지만 Subject 테이블에서 작동하고 새 행을 삽입했습니다. 모든 변경 사항을 롤백하지 않아야합니까?오류가 있어도 트랜잭션이 롤백되지 않습니까?

BEGIN TRANSACTION 
INSERT INTO Subject (Name, SupervisorId) VALUES('Statistics', 4) 
UPDATE Teacher SET Name ='Hady' WHERE Id=111 
COMMIT TRANSACTION 

나는 다음에 좀 더 로직을 추가 할 수 있지만 여전히 작동하지 :

Begin Try 
BEGIN TRANSACTION 
INSERT INTO Subject (Name, SupervisorId) VALUES('Statistics', 4) 
UPDATE TeacherO SET Name ='Hady' WHERE Id=111 
COMMIT TRANSACTION 
End Try 
Begin Catch 
ROLLBACK TRANSACTION 
End Catch 

답변

2

I을 올바르게 이해한다면, 당신은 ... 교사 테이블에서 = 111가 오류라고 ID를 가진 행이없는 경우 시도가 교사 테이블의 행을 업데이트하는 것을 가정

금지 된 또는 불가능한 일을 할 때 오류가 발생합니다. 캐스트없이 문자열에 숫자를 추가하려고하면. 아니면 존재하지 않는 물건을 손에 넣으 려한다면 아마도 30.02.2016을 현재 날짜로 변환하고 싶을 것입니다. 모두 오류입니다.

그러나 id = 111 인 모든 행을 업데이트하도록 데이터베이스에 지시하면 정확하게 발생합니다. id = 111 인 모든 행이 업데이트됩니다. 귀하의 경우 영향을받는 행의 수가 0이됩니다. 그러나 이것은 오류가 아닙니다 ...

+0

저는 생각하기에 'Teacher' 테이블을'TeacherO '테이블로 변경했습니다. 그러나 TeacherO 테이블은 아무것도 변경하지 않았으며, 그렇지 않습니다. 오류 트랜잭션 작업? –

+1

존재하지 않는 테이블에 대해 'UPDATE'를 사용하려고하면 컴파일되지 않아야합니다 ... ** 기존 * 행에 * 잘못된 * 값을 설정하려고하면 오류가 발생했습니다 ** . ID = 2 인 교사가 있다고 가정 해 봅시다. ** UPDATE 교사 SET ID = 'test'WHERE Id = 2;와 함께 실제 ** 오류가 발생합니다. 어떤 경우에도 유효하지 않습니다 ... – Shnugo

+1

알았습니다. , 먼저 오류 처리에 대해 읽어야합니다. –

0

당신은 XACT_ABORT이 그것을 보장하는 옵션을 설정 사용해야은 롤백합니다. 그것 없이는 롤백이 발생하지 않습니다.

SET XACT_ABORT ON; 
BEGIN TRY 
    BEGIN TRANSACTION; 
    INSERT INTO Subject (Name, SupervisorId) VALUES('Statistics', 4); 
    UPDATE TeacherO SET Name ='Hady' WHERE Id=111; 
    COMMIT TRANSACTION; 
END TRY 
BEGIN CATCH 
    ROLLBACK TRANSACTION; 
END CATCH 
관련 문제