다음을 통해 공유


sqlsrv_rollback

PHP 드라이버 다운로드

지정된 연결에서 현재 트랜잭션을 롤백하고 자동 커밋 모드에 대한 연결을 반환합니다. 현재 트랜잭션에는 sqlsrv_begin_transaction 호출 후 및 sqlsrv_rollback 또는 sqlsrv_commit 호출하기 전에 실행된 지정된 연결의 모든 문이 포함됩니다.

참고 항목

MICROSOFT Drivers for PHP for SQL Server는 기본적으로 자동 커밋 모드입니다. 즉, 모든 쿼리는 sqlsrv_begin_transaction을 사용하여 명시적 트랜잭션의 일부로 지정하는 경우를 제외하고 성공 시 자동으로 커밋됩니다.

참고 항목

활성 트랜잭션에 없고 sqlsrv_rollback transaction sqlsrv_begin_transaction이 호출된 경우 false 를 반환하고 트랜잭션에 없음 오류가 오류 수집에 추가됩니다.

구문

  
sqlsrv_rollback( resource $conn)  

매개 변수

$conn: 트랜잭션이 활성화된 연결입니다.

Return Value

부울 값: 트랜잭션이 성공적으로 롤백되면 true 이고, 그렇지 않으면 false입니다.

예시

다음 예제에서는 트랜잭션의 일부로 두 개의 쿼리를 실행합니다. 두 쿼리 모두 성공하면 트랜잭션이 커밋됩니다. 쿼리 중 하나(또는 둘 다)가 실패하면 트랜잭션이 롤백됩니다.

예제의 첫 번째 쿼리는 AdventureWorks 데이터베이스의 Sales.SalesOrderDetail 테이블에 새 판매 주문을 삽입합니다. 주문은 제품 ID가 709인 제품의 5개 단위입니다. 두 번째 쿼리는 제품 ID 709의 재고 수량을 5단위로 줄입니다. 두 쿼리 모두 성공해야 데이터베이스에 주문 및 제품 가용성 상태가 정확하게 반영되므로 이러한 쿼리가 트랜잭션에 포함되어 있습니다.

이 예시에서는 SQL Server 및 AdventureWorks 데이터베이스가 로컬 컴퓨터에 설치된 것으로 가정합니다. 모든 출력은 명령줄에서 예시가 실행될 때 콘솔에 기록됩니다.

<?php  
/* Connect to the local server using Windows Authentication and  
specify the AdventureWorks database as the database in use. */  
$serverName = "(local)";  
$connectionInfo = array( "Database"=>"AdventureWorks");  
$conn = sqlsrv_connect( $serverName, $connectionInfo);  
if( $conn === false )  
{  
     echo "Could not connect.\n";  
     die( print_r( sqlsrv_errors(), true ));  
}  
  
/* Initiate transaction. */  
/* Exit script if transaction cannot be initiated. */  
if ( sqlsrv_begin_transaction( $conn) === false )  
{  
     echo "Could not begin transaction.\n";  
     die( print_r( sqlsrv_errors(), true ));  
}  
  
/* Initialize parameter values. */  
$orderId = 43659; $qty = 5; $productId = 709;  
$offerId = 1; $price = 5.70;  
  
/* Set up and execute the first query. */  
$tsql1 = "INSERT INTO Sales.SalesOrderDetail   
                     (SalesOrderID,   
                      OrderQty,   
                      ProductID,   
                      SpecialOfferID,   
                      UnitPrice)  
          VALUES (?, ?, ?, ?, ?)";  
$params1 = array( $orderId, $qty, $productId, $offerId, $price);  
$stmt1 = sqlsrv_query( $conn, $tsql1, $params1 );  
  
/* Set up and executee the second query. */  
$tsql2 = "UPDATE Production.ProductInventory   
          SET Quantity = (Quantity - ?)   
          WHERE ProductID = ?";  
$params2 = array($qty, $productId);  
$stmt2 = sqlsrv_query( $conn, $tsql2, $params2 );  
  
/* If both queries were successful, commit the transaction. */  
/* Otherwise, rollback the transaction. */  
if( $stmt1 && $stmt2 )  
{  
     sqlsrv_commit( $conn );  
     echo "Transaction was committed.\n";  
}  
else  
{  
     sqlsrv_rollback( $conn );  
     echo "Transaction was rolled back.\n";  
}  
  
/* Free statement and connection resources. */  
sqlsrv_free_stmt( $stmt1);  
sqlsrv_free_stmt( $stmt2);  
sqlsrv_close( $conn);  
?>  

트랜잭션 동작에 집중하기 위해 이전 예제에는 권장되는 일부 오류 처리가 포함되지 않습니다. 프로덕션 애플리케이션의 경우 sqlsrv 함수에 대한 모든 호출에서 오류를 확인하고 그에 따라 처리하는 것이 좋습니다.

참고 항목

포함된 Transact-SQL을 사용하여 트랜잭션을 수행하지 마세요. 예를 들어, 트랜잭션을 시작하기 위해 Transact-SQL 쿼리로 "BEGIN TRANSACTION"이 있는 문을 실행하지 않습니다. 포함된 Transact-SQL을 사용하여 트랜잭션을 수행하는 경우 예상 트랜잭션 동작을 보장할 수 없습니다.

참고 항목

SQLSRV 드라이버 API 참조

방법: 트랜잭션 수행

Microsoft Drivers for PHP for SQL Server 개요