sqlsrv_commit

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

참고

SQL Server Driver for PHP는 기본적으로 자동 커밋 모드로 설정됩니다. 즉, sqlsrv_begin_transaction을 사용하여 명시적 트랜잭션의 일부로 지정하지 않은 모든 쿼리는 성공 시 자동으로 커밋됩니다

참고

sqlsrv_begin_transaction으로 초기화된 활성 트랜잭션에 포함되지 않은 연결에서 sqlsrv_commit을 호출하면 false가 반환되고 Not in Transaction 오류가 오류 컬렉션에 추가됩니다.

구문

sqlsrv_commit( resource $conn )

매개 변수

$conn: 트랜잭션이 활성 상태인 연결입니다.

반환 값

부울 값: 트랜잭션이 성공적으로 커밋되었으면 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 execute 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을 사용하여 트랜잭션을 수행하지 마십시오. 예를 들어, "BEGIN TRANSACTION"이 포함된 문을 Transact-SQL 쿼리로 실행하여 트랜잭션을 시작하지 마십시오. 포함된 Transact-SQL을 사용하여 트랜잭션을 수행할 경우 트랜잭션 동작이 예상대로 나타나지 않을 수 있습니다.

참고 항목

태스크

방법: 트랜잭션 수행

관련 자료

API 참조(SQL Server Driver for PHP)
SQL Server Driver for PHP 소개