문제

일부 DEVS/DBA는 모든 데이터베이스 호출, 심지어 읽기 전용 호출에서 트랜잭션을 사용하는 것이 좋습니다. 트랜잭션 내에서 삽입/업데이트를 이해하는 동안 거래 내에서 읽는 것의 이점은 무엇입니까?

도움이 되었습니까?

해결책

따라서 데이터베이스를 일관되게 볼 수 있습니다. 서로 연결되는 두 개의 테이블이 있다고 상상해보십시오. 그러나 어떤 이유로 든 pseuodocode에서 2 개의 선택을합니다.

myRows = query(SELECT * FROM A)
moreRows = query(SELECT * FROM B WHERE a_id IN myRows[id])

두 쿼리 사이에서 누군가가 B를 변경하여 일부 행을 삭제하면 문제가 발생합니다.

다른 팁

Roborg의 말과 마찬가지로, 당신은 진술 사이의 팬텀 데이터를 읽지 않기 위해 트랜잭션을 선택할 수 있습니다. 하지만 SQL Server의 기본 트랜잭션 격리 레벨은 더러운 읽기 만 방지 할 수 있도록 저지른 것으로 판결됩니다. 팬텀 데이터를 방지하려면 최소한 반복 가능한 읽기를 사용해야합니다. "필요할 때만이 옵션을 사용하십시오."

http://msdn.microsoft.com/en-us/library/ms173763.aspx

나는 '트랜잭션'이 다른 SQL 서버에서 매우 다르게 행동한다는 것을 알았습니다. 경우에 따라 트랜잭션을 시작하면 다른 모든 연결이 트랜잭션이 커밋되거나 롤백 될 때까지 SQL을 실행할 수 없게됩니다 (MS SQLServer 6.5). 다른 사람들은 아무런 문제가 없으며 수정 (Oracle)이있을 때만 잠그십시오. 잠금 장치는 셀 잠금 / 행 잠금 / 페이지 잠금 / 테이블 잠금 장치 만 포함하도록 확장 할 수도 있습니다.

일반적으로 다중 삽입 / 삭제 / 업데이트 문의 데이터 통합을 유지 해야하는 경우에만 트랜잭션을 사용합니다. 그럼에도 불구하고, 나는 데이터베이스가 자동으로 그리고 원자 적으로 수행하도록 DB 정의 캐스케이드 삭제를 사용하여 이것을 구현하는 것을 선호합니다.

다중 수정을 롤백하려는 상황을 예측할 수있는 경우 트랜잭션을 사용하지만, 그렇지 않으면 데이터베이스는 추가 코드가없는 원자 업데이트를 수행합니다.

나는 지난 몇 분 동안 이것을 확인해 왔습니다. 왜냐하면 그것이 내가 더 많이 알아야 할 것이기 때문입니다. 여기 내가 찾은 것이 있습니다.

사람이 레코드를 읽고 수정되거나 읽기를 원하지 않는 동안 해당 행을 잠그고 싶다면 트랜잭션이 선택에 유용합니다. 예를 들어이 쿼리를 실행합니다.

(쿼리 창 1)

tran select *에서 * mytable with (rowlock xlock) 여기서 id = 1

(쿼리 창 2)

mytable에서 *를 선택하십시오

(쿼리 창 2는 창에서 실행할 때까지 결과를 반환하지 않습니다.

Tran을 커밋하십시오

유용한 링크:

http://msdn.microsoft.com/en-us/library/aa213039.aspx

http://msdn.microsoft.com/en-us/library/aa213026.aspx

http://msdn.microsoft.com/en-us/library/ms190345.aspx

저의 목표는 블록 할 무언가를 얻는 것이 었습니다. 그리고 마침내 XLock을 추가 한 후에 효과가있었습니다. Rowlock을 사용하는 것은 작동하지 않았습니다. 나는 그것이 공유 잠금 잠금 장치를 발행하고 있다고 가정하고있다 (그리고 데이터는 읽혔다). 그러나 나는 여전히 이것을 탐색하고있다.

추가 - (updlock rowlock)를 사용하면 행을 업데이트로 선택하고 잠글 수 있으므로 동시성에 도움이됩니다.

테이블 힌트에주의하십시오. 우연히 적용하기 시작하면 앱에 소수의 사용자를 얻으면 시스템이 크롤링 속도가 느려집니다. 그것이 내가 이것을 조사하기 전에 내가 알았던 한 가지입니다.)

거래의 주요 목적 중 하나는 문제가있는 경우 롤백 잠재력을 제공하는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top