2016-08-03 65 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」插入一個記錄,它成功地插入。如何鎖定Transaction中的表並在提交或回滾之後將其解鎖。

+0

交易隱藏了其他用戶的相關新記錄,直到交易提交。任何人在睡覺時對這些表進行選擇都不會看到新的數據。 –

+0

看起來像一個重複:http://stackoverflow.com/questions/9842253/lock-table-while-inserting – FLICKER

回答

0

事務將鎖定一個表,直到事務提交。即使查詢結束,如果交易尚未提交或回滾,交易仍將保持開放狀態。只要查詢命中COMMIT或ROLLBACK,表將被解鎖。

在你的代碼中,雖然我沒有看到你在哪裏打開了一個事務,但如果你沒有打開一個事務,那麼SQL Server會在提交和回滾時出錯,因爲MSSQL足夠聰明,可以自己關閉事務if您尚未明確開啓交易。

+0

謝謝你的回答。我打開這樣的事務sqlsrv_begin_transaction($ dbConnection)其中$ dbConnection是有效的連接。我不確定它是否正確 –

+0

我不確定這是否有效。我以爲你只是在談論SQL本身。我相信如果你的連接字符串是正確的,它會工作。 –