我正在使用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);
}
答案 0 :(得分:1)
我认为当你想连接到sql server时,你应该将MultipleActiveResultSets
设置为true
:
$conn = sqlsrv_connect('127.0.0.1', array
(
'Database' => 'Adventureworks',
'MultipleActiveResultSets' => true, // MARS ENABLED
));
答案 1 :(得分:0)
根据您的错误,似乎$nextQuery = sqlsrv_query($stmt2);
正在同一会话中启动新事务。你可以在开始第二次之前提交!$firstQuery
吗?