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);
}
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
@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. –
Ý 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