2012-02-29 33 views
5

Tôi đang làm việc trên một ứng dụng web được viết bằng PHP và sử dụng SQL Server 2008. Để kết nối với cơ sở dữ liệu, tôi đã sử dụng SQLSRV driever của Microsoft. Trong một phần của ứng dụng này, tôi phải sử dụng các giao dịch SQL. Như Microsoft đã đề xuất, tôi đã làm chính xác dựa trên bài viết này. Các quy trình chính trong mã của tôi thực hiện theo các bước sau:
1- bắt đầu giao dịch sql
2- gửi thông tin đến tệp PHP qua jQuery và kiểm tra kết quả được gửi bởi JSON
3- rollback nếu kết quả là false và chuyển đến truy vấn nếu nó đúng.
4- cam kết giao dịch nếu không xảy ra lỗi và tất cả kết quả đều ổn.Lỗi "Giao dịch mới không được phép" trong trình điều khiển PHP và SQLSRV là gì?

// 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. 
} 

Vấn đề tôi có là lỗi này:

[Microsoft][SQL Server Native Client 10.0][SQL Server] New transaction is not allowed because there are other threads running in the session

Tôi đang sử dụng trình điều khiển SQLSRV ver.2.
Lỗi này là gì? Làm thế nào tôi có thể giải quyết nó?

tôi bao gồm các lớp sqlsrv của riêng tôi để phần đầu của index.php chứa phương thức dưới đây:

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

Khi nào lỗi này xảy ra: trước hoặc sau "sqlsrv_query ($ stmt1);"? Có thể bạn có "sqlsrv_begin_transaction" ở đâu đó trước mã giả này? – JScoobyCed

+0

@JScoobyCed: Không, nó phải ở nơi hiện tại. Đây không phải là một cảnh báo. Đó là một lỗi. Vì vậy, nó sẽ dừng lại tất cả các quá trình. Không có 2 truy vấn nào sẽ không thực thi. –

+0

Ý tôi là, bạn có một lệnh gọi khác là "sqlsrv_begin_transaction" trước mã giả này không, do đó nó sẽ khiếu nại rằng một giao dịch khác đã được bắt đầu. Bạn đã thử gỡ lỗi mã để bạn có thể xác định dòng mã lỗi nào xảy ra. – JScoobyCed

Trả lời

1

tôi nghĩ rằng bạn nên đặt MultipleActiveResultSets để true khi bạn muốn kết nối đến máy chủ sql:

$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

Không giải quyết được sự cố của tôi ... –

0

Từ lỗi của bạn, Nó có vẻ như $nextQuery = sqlsrv_query($stmt2); đang bắt đầu một giao dịch mới i n cùng một phiên. Bạn có thể cam kết !$firstQuery trước khi bắt đầu lần thứ hai không?

+1

Colin, vậy giao dịch này là gì? Hoàn toàn không. Tôi phải cam kết giao dịch nếu tất cả các phần của quy trình có thể đạt được thành công trong hoạt động của họ. –

Các vấn đề liên quan