트랜잭션 내부의 SELECT 문과 트랜잭션 외부의 SELECT 문이 다릅니까?
기본값을 실행합니까?READ COMMITTED 격리 수준은 어떻게든 만든다.SELECT거래에 없는 것과 거래의 내부에서 다르게 행동하는 진술?
예, 트랜잭션 내부에 있는 것은 해당 트랜잭션에서 이전의 다른 Insert/Update/delete 문에 의해 변경된 내용을 볼 수 있습니다. 트랜잭션 외부에 있는 Select 문은 볼 수 없습니다.
격리 수준이 수행하는 작업만 묻는 경우 모든 Select 문(예, 모든 종류의 문)이 트랜잭션에 있음을 이해합니다.거래에 명시적으로 존재하는 것과 독립적으로 존재하는 것의 유일한 차이점은 독립적으로 존재하는 것이 거래를 실행하기 직전에 거래를 시작하고 실행 직후에 커밋하거나 롤백한다는 것입니다.
트랜잭션에 명시적으로 있는 것(Begin Transaction 문이 있기 때문에)은 해당 동일한 트랜잭션 내에서 해당 Select 문 앞이나 뒤에 다른 문(삽입/업데이트/삭제 등)을 발생시킬 수 있습니다.
따라서 격리 수준을 설정하더라도 선택한 항목(명시 트랜잭션 내부 또는 외부)은 모두 해당 격리 수준에서 작동하는 트랜잭션에 포함됩니다.
추가:다음은 SQL 서버용이지만 모든 데이터베이스가 동일한 방식으로 작동해야 합니다.SQL Server에서 쿼리 프로세서는 항상 자동 커밋, 암시 또는 명시의 세 가지 트랜잭션 모드 중 하나에 있습니다.
자동 커밋은 SQL Server Database Engine의 기본 트랜잭션 관리 모드입니다. 모든 Transact-SQL 문은 완료되면 커밋되거나 롤백됩니다. ...문이 성공적으로 완료되면 문이 커밋되고 오류가 발생하면 문이 롤백됩니다.이것은 기본값이며, 댓글에 있는 @Alex의 질문에 대한 답변입니다.
Implicit Transaction 모드에서 SQL Server Database Engine은 현재 트랜잭션이 커밋되거나 롤백된 후 새 트랜잭션을 자동으로 시작합니다.트랜잭션의 시작을 설명하는 작업은 수행하지 않고 각 트랜잭션만 커밋하거나 롤백합니다.암시적 트랜잭션 모드는 연속적인 트랜잭션 체인을 생성합니다. ..." 이탤릭체로 표시된 스니펫은 단일 또는 다중 문 트랜잭션이든 각 트랜잭션에 대한 것입니다.
명시적으로 트랜잭션을 시작하면 엔진이 명시적 트랜잭션 모드로 전환됩니다.
BEGIN TRANSACTION진술.그런 다음 트랜잭션을 명시적으로 종료할 때까지 모든 문이 해당 트랜잭션 내에서 실행됩니다.COMMIT또는ROLLBACK또는 엔진을 종료하고 롤백하는 오류가 발생한 경우.
네, 약간의 차이가 있습니다.MySQL의 경우 첫 번째 쿼리 전까지는 데이터베이스가 실제로 스냅샷으로 시작되지 않습니다.따라서 중요한 것은 시작이 아니라 거래 내 첫 번째 진술입니다.다음을 수행할 경우:
#Session 1
begin; select * from table;
#Session 2
delete * from table; #implicit autocommit
#Session 1
select * from table;
그러면 세션 1에서 두 번(삭제하기 전에 표에 있던 정보) 동일한 내용을 가져옵니다.세션에서 트랜잭션(커밋, 시작 또는 롤백)을 종료하고 해당 세션에서 다시 확인하면 테이블이 비어 있는 것으로 표시됩니다.
읽기 전용 분리 수준은 기록된 레코드에 대한 것입니다.이 select 문이 트랜잭션에 있는지 여부와는 상관이 없습니다(동일한 트랜잭션 중에 작성된 항목 제외)
데이터베이스(또는 select 문에 사용된 모든 테이블의 기본 스토리지 엔진인 mysql)가 트랜잭션인 경우 "트랜잭션 외부"에서 이를 실행할 방법이 없습니다.
"자동 커밋 모드에서 실행"을 의미했을 수도 있지만 "트랜잭션이 아님"과는 다릅니다.후자의 경우에는 여전히 트랜잭션에서 실행됩니다. 단지 당신의 진술이 끝나는 즉시 트랜잭션이 종료됩니다.
따라서 두 경우 모두 실행 중에 단일 선택 문이 READ COMMITED 수준에서 다른 트랜잭션과 격리됩니다.
이제 읽기 전용 트랜잭션 격리 수준에 대해 의미하는 바가 무엇인지, 놀랍게도 그렇게 많지는 않습니다.
READ COMMITED는 반복할 수 없는 읽기가 발생할 수 있음을 의미합니다. 동일한 트랜잭션에서 여러 select 문을 실행할 때 특정 시점에 선택한 행이 다른 트랜잭션에 의해 수정 및 커밋될 수 있습니다.나중에 동일한 보류 중인 트랜잭션에서 선택 문을 다시 실행할 때 이러한 변경 사항을 볼 수 있습니다.자동 커밋 모드에서는 이러한 두 개의 선택 문이 자체 트랜잭션에서 실행됩니다.다른 트랜잭션이 처음에 선택한 행을 수정하고 커밋한 경우에는 두 번째로 문을 실행했을 때도 변경 내용을 볼 수 있습니다.
언급URL : https://stackoverflow.com/questions/1976686/is-there-a-difference-between-a-select-statement-inside-a-transaction-and-one-th
'programing' 카테고리의 다른 글
| 아이폰 앱에서 UIButton/UILabel '패딩'을 달성하는 방법 (0) | 2023.07.31 |
|---|---|
| "string.split is not function" 오류의 원인은 무엇입니까? (0) | 2023.07.31 |
| 너비, 내부 너비 및 외부 너비, 높이, 내부의 차이높이 및 외부높이(jQuery) (0) | 2023.07.31 |
| 항법 컨트롤러의 투명 모달 뷰 (0) | 2023.07.31 |
| oracle 프로시저가 정수를 반환합니다. (0) | 2023.07.31 |