【问题标题】:Will the Transactions in MSSQL lock the tablesMSSQL 中的事务会锁定表吗
【发布时间】:2016-12-09 11:30:33
【问题描述】:

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'中插入一条记录,它插入成功。如何锁定事务中的表并在提交或回滚后解锁它们。

【问题讨论】:

标签: php sql-server transactions


【解决方案1】:

事务将锁定表,直到事务提交。即使查询结束,如果事务尚未提交或回滚,事务仍将保持打开状态。只要查询命中 COMMIT 或 ROLLBACK,表就会被解锁。

在您的代码中,虽然我看不到您在哪里打开了事务,但如果您不打开事务,那么 SQL Server 将在提交和回滚时出错,因为 MSSQL 足够聪明,可以自行关闭事务,如果您没有明确打开交易。

【讨论】:

  • 感谢您的回答。我正在打开这样的事务 sqlsrv_begin_transaction( $dbConnection ) 其中 $dbConnection 是有效的连接。我不确定它是否正确
  • 我不确定这是否可行。我以为你只是在谈论 SQL 本身。我确定您的连接字符串是否正确,它会起作用。
猜你喜欢
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多