【发布时间】:2010-01-05 16:30:51
【问题描述】:
我正在尝试完全掌握交易的概念。因此以下问题......(当然是新手,所以不要笑:D)
我在 PHP 中设置了一个(简化的)事务(使用 microsoft 的 PHP SQL 驱动程序)。我想获取我要删除的行以便稍后进行一些额外的处理:
sqlsrv_begin_transaction($conn);
$sql = "SELECT * FROM test WITH (XLOCK) WHERE a<10";
$statement = sqlsrv_query($conn,$sql);
$sql = "DELETE FROM test WHERE a<10";
sqlsrv_query($conn,$sql);
$result = get_result_array($statement);
sqlsrv_commit($conn);
$result2 = get_result_array($statement);
1) 我确实在 $result 中得到了预期的结果,但在 $result2 中得到了一个空数组。为什么?
我希望 $result2 中只有一个结果,因为那时事务实际上已经执行了。我猜 $result 中的结果是内存中的一种“临时”结果,而不是实际数据库的结果。
2) 可能是在事务启动和实际提交之间,来自另一个连接的另一个查询更改了匹配的行(a
或者是(a)事务发生在数据库的内存副本中(不受来自其他连接的中间查询的影响),还是(b)自事务开始以来获得的锁已经正在处理来自其他连接的其他查询?
输入此内容后,我期待答案 b....?
【问题讨论】:
-
提交后
$conn中的连接是否仍然打开?如果不是,也许这就是$result2为空的原因。 (它尝试使用关闭的连接)。
标签: php sql-server transactions locking