PHP和SQLSRV驱动程序中的“不允许新事务”错误是什么?

时间:2012-02-29 06:33:39

标签: php sql-server transactions

我正在使用PHP编写的Web应用程序并使用SQL Server 2008.为了连接到数据库,我使用了Microsoft的SQLSRV driever。在本应用程序的一部分中,我必须使用SQL Transactions。正如微软建议的那样,我完全基于这篇文章做到了。我的代码中的主要流程遵循以下步骤:
1-启动sql transaction
2-通过jQuery向PHP文件发送信息,并检查JSON发送的结果 如果结果为false则回滚3,如果是真,则转到下一个查询 如果没有发生错误且所有结果都正常,则提交4次事务。

// This is my pseudo code
if (sqlsrv_begin_transaction( $sqlsrv->sqlsrvLink ) === true) {

  $firstQuery = sqlsrv_query($stmt1);
  if (!$firstQuery) {
     sqlsrv_rollback();
  } else {
     $nextQuery = sqlsrv_query($stmt2);
     if (!$nextQuery) {
        sqlsrv_rollback();
     } else {
        sqlsrv_commit();
     }
  }

} else {
   print_r(sqlsrv_errors()); // Here is where I get the error below.
}

我遇到的问题是这个错误:

  

[Microsoft] [SQL Server Native Client 10.0] [SQL Server]不允许新事务,因为会话中还有其他线程在运行

我正在使用SQLSRV驱动程序ver.2 这个错误是什么?我该如何解决?

我将自己的sqlsrv类包含在index.php的第一部分中,其中包含以下方法:

function __construct($dbServerName,$dbUsername,$dbPassword,$dbName)
{
    $connectionInfo = array("Database"=> $dbName, "CharacterSet" => "UTF-8");
    $this->sqlsrvLink = sqlsrv_connect($dbServerName, $connectionInfo);
    if ($this->sqlsrvLink === false) {
        $this->sqlsrvError = sqlsrv_errors();
    }
}

function __destruct()
{
    sqlsrv_close($this->sqlsrvLink);
}

2 个答案:

答案 0 :(得分:1)

我认为当你想连接到sql server时,你应该将MultipleActiveResultSets设置为true

 $conn = sqlsrv_connect('127.0.0.1', array
        (
           'Database' => 'Adventureworks',
           'MultipleActiveResultSets' => true, // MARS ENABLED
        ));

http://php.net/manual/de/ref.pdo-sqlsrv.connection.php

答案 1 :(得分:0)

根据您的错误,似乎$nextQuery = sqlsrv_query($stmt2);正在同一会话中启动新事务。你可以在开始第二次之前提交!$firstQuery吗?