PHP如果同时发送多个sqlsrv查询,如何处理错误


PHP How to handle errors if multiple sqlsrv-querys are sent simultaneously

我得到了下表:

CREATE TABLE [dbo].[TestDB] (
    [col1] INT NOT NULL, 
    [col2] VARCHAR(50) NOT NULL
);

现在我想添加条目:

    $params=array(123,'someString');
    $sql = "insert into testDB values(?,?)";
    $stmt = sqlsrv_query( $conntask, $sql ,$params);
    if( $stmt === false) {
        echo $sql;
        print_r($params);
        die( print_r( sqlsrv_errors(), true) );
    }

如果出现错误,$stmt将为false,将打印消息并终止脚本。

我的问题

如果我想添加多个条目,我会同时发送所有查询。

    $params=array(123,'someString','notANumber','someOtherString');
    $sql = "insert into testDB values(?,?) insert into testDB values(?,?)";
    $stmt = sqlsrv_query( $conntask, $sql ,$params);
    if( $stmt === false) {
        echo $sql;
        print_r($params);
        die( print_r( sqlsrv_errors(), true) );
    }

在本例中,第一次插入将成功,第二次插入将失败,因为我试图将字符串放入int列中
现在$stmt不是false,查询将一直执行到出现错误为止。

我的问题:

  1. 如何随时检查查询是否失败
  2. 如何确保查询要么完整执行,要么根本不执行

您的transaction必须在出现任何错误时回滚。

在事务开始时使用SET XACT_ABORT ON命令,然后添加BEGIN TRANSACTION命令应该可以解决问题。

  • 在SMSS侧上的使用

    SET XACT_ABORT ON;
    BEGIN TRANSACTION
      -- your queries here
    COMMIT TRANSACTION
    
  • 在PHP端使用

    ...
    $sql = "SET XACT_ABORT ON; " .
           "BEGIN TRANSACTION " .
           "insert into testDB values(?,?) insert into testDB values(?,?)" .
           "COMMIT TRANSACTION";
    ...