2016-08-03 4 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 />"; 
} 

を(任意の構文エラーを無視する)、I「はORDER_TABLE」テーブルにレコードを挿入しようとし、それが正常に挿入されました。トランザクションにあるテーブルをロックし、コミットまたはロールバックの後にロックを解除するにはどうすればよいですか?

+0

トランザクションは、トランザクションがコミットされるまで、関連する新しいレコードを他のユーザーから隠します。あなたが寝ている間にそれらのテーブルで選択を行っている人は誰も新しいデータを見ません。 –

+0

は重複のように見えます:http://stackoverflow.com/questions/9842253/lock-table-while-inserting – FLICKER

答えて

0

トランザクションは、トランザクションがコミットされるまでテーブルをロックします。クエリが終了しても、トランザクションがコミットまたはロールバックされていなければ、トランザクションは引き続き開いたままになります。クエリがCOMMITまたはROLLBACKに達する限り、テーブルはロック解除されます。

トランザクションを開かないとトランザクションを開いた場所がわかりませんが、SQL Serverはコミットおよびロールバック時にエラーが発生します。明示的にトランザクションを開いていません。

+0

ありがとうございます。私はこのsqlsrv_begin_transaction($ dbConnection)のようなトランザクションを開きます。$ dbConnectionは有効な接続です。それが正しいかどうかわからない –

+0

それがうまくいくかどうかわからない。私はあなたがSQLだけを話していると思っていました。私はあなたの接続文字列が正しく動作することを確認しています。 –

関連する問題