2016-08-03 3 views
0

MSSQL의 트랜잭션이 테이블을 잠글 것인가? 그렇다면 잠금은 전체 트랜잭션 기간 동안 유지되거나 명령문 실행 기간 동안 만 보유됩니다. 다음은 트랜잭션의 예는 (구문 오류를 무시) MSSQL의 트랜잭션이 테이블을 잠글습니까

if (sqlsrv_begin_transaction($dbConnection) === false) { 
    die(print_r(sqlsrv_errors(), true)); 
} 
$query = "INSERT INTO order_table (name,description,created_at) VALUES ('test_name','test_Transaction','some_date')"; 
$stmt1 = sqlsrv_query($dbConnection ,$query) or die('MSSQL error: ' . mssql_get_last_message()); 

$query = "INSERT INTO other_details_table (order_id,details) VALUES ('1234','order_details')"; 
$stmt2 = sqlsrv_query($dbConnection ,$query) or die('MSSQL error: ' . mssql_get_last_message()); 

sleep('20'); // used to delay the transaction time 

/* If both queries were successful, commit the transaction. */ 
/* Otherwise, rollback the transaction. */ 
if($stmt1 && $stmt2) { 
sqlsrv_commit($conn); 
echo "Transaction committed.<br />"; 
} else { 
sqlsrv_rollback($conn); 
echo "Transaction rolled back.<br />"; 
} 

위의 트랜잭션이 진행되는

, 나는 성공적으로 삽입, 테이블 'order_table'에 레코드를 삽입하려고합니다. 트랜잭션에있는 테이블을 잠그고 커밋 또는 롤백 한 후에 테이블의 잠금을 해제하려면 어떻게합니까?

+0

트랜잭션은 트랜잭션이 커밋 될 때까지 다른 사용자로부터 관련 새 레코드를 숨 깁니다. 자고있는 동안 그 테이블에서 셀렉트를하는 사람은 새 데이터를 보지 못합니다. –

+0

중복으로 보입니다. http://stackoverflow.com/questions/9842253/lock-table-while-inserting – FLICKER

답변

0

트랜잭션은 트랜잭션이 커밋 될 때까지 테이블을 잠급니다. 쿼리가 끝나더라도 트랜잭션이 커밋되거나 롤백되지 않으면 트랜잭션은 여전히 ​​열려 있습니다. 쿼리가 COMMIT 또는 ROLLBACK에 도달하면 테이블 잠금이 해제됩니다.

트랜잭션을 열지 않으면 트랜잭션을 연 장소가 표시되지 않지만 MSSQL이 트랜잭션을 단독으로 닫을만큼 스마트하기 때문에 SQL Server는 커밋 및 롤백시 오류가 발생합니다. 당신은 명시 적으로 거래를 열지 않았다.

+0

답장을 보내 주셔서 감사합니다. 이 sqlsrv_begin_transaction ($ dbConnection)과 같은 트랜잭션을 여는 중입니다. $ dbConnection은 유효한 연결입니다. 그것이 맞는지 아닌지 확실하지 않습니다. –

+0

그것이 작동하는지 확실하지 않습니다. 나는 당신이 SQL 자체에 대해서 이야기하고 있다고 생각했다. 연결 문자열이 맞으면 제대로 작동 할 것입니다. –

관련 문제