为什么在循环结果集时无法启动事务?

时间:2016-03-24 15:03:50

标签: php sql sql-server pdo

我有以下PDO代码(PHP 5.6,Microsoft SQL Server 2014):

$st = $db->prepare('SELECT TOP 5 * FROM table');
$st->execute();
while ($st->fetch()) {
    var_dump($db->beginTransaction());
    //$db->rollback();
}

结果如下:

bool(false)
bool(false)
bool(false)
bool(false)
bool(true)

我期待所有真实的结果,但在检索到最后一条记录之前,交易才会开始。为什么我不能在循环结果集时启动事务?

开启或关闭MARS似乎没有任何效果。

1 个答案:

答案 0 :(得分:1)

只要光标处于打开状态,就无法在使用MSSQL时启动新事务。在结果集上调用closeCursor()或检索消耗查询返回的所有结果会释放该游标并再次允许事务。

也; beginTransaction()返回false也会产生一个可以使用errorInfo()检索的错误;话说:

  

不允许使用新事务,因为会话中还有其他线程在运行。