Bagikan melalui


Cara: Melakukan Transaksi

Unduh driver PHP

Driver SQLSRV driver Microsoft untuk PHP untuk SQL Server menyediakan tiga fungsi untuk melakukan transaksi:

Driver PDO_SQLSRV menyediakan tiga metode untuk melakukan transaksi:

Lihat PDO::beginTransaction misalnya.

Sisa topik ini menjelaskan dan menunjukkan cara menggunakan driver SQLSRV untuk melakukan transaksi.

Keterangan

Langkah-langkah untuk menjalankan transaksi dapat diringkas sebagai berikut:

  1. Mulai transaksi dengan sqlsrv_begin_transaction.

  2. Periksa keberhasilan atau kegagalan setiap kueri yang merupakan bagian dari transaksi.

  3. Jika sesuai, lakukan transaksi dengan sqlsrv_commit. Jika tidak, gulung balik transaksi dengan sqlsrv_rollback. Setelah memanggil sqlsrv_commit atau sqlsrv_rollback, driver dikembalikan ke mode penerapan otomatis.

    Secara default, Driver Microsoft untuk PHP untuk SQL Server berada dalam mode penerapan otomatis. Ini berarti bahwa semua kueri secara otomatis diterapkan setelah berhasil kecuali telah ditetapkan sebagai bagian dari transaksi eksplisit dengan menggunakan sqlsrv_begin_transaction.

    Jika transaksi eksplisit tidak dilakukan dengan sqlsrv_commit, transaksi tersebut digulung balik setelah menutup koneksi atau penghentian skrip.

    Jangan gunakan Transact-SQL yang disematkan untuk melakukan transaksi. Misalnya, jangan jalankan pernyataan dengan "BEGIN TRANSACTION" sebagai kueri Transact-SQL untuk memulai transaksi. Perilaku transaksi yang diharapkan tidak dapat dijamin ketika Anda menggunakan Transact-SQL tertanam untuk melakukan transaksi.

    Fungsi sqlsrv yang tercantum sebelumnya harus digunakan untuk melakukan transaksi.

Contoh

Deskripsi

Contoh berikut menjalankan beberapa kueri sebagai bagian dari transaksi. Jika semua kueri berhasil, transaksi dilakukan. Jika salah satu kueri gagal, transaksi akan digulung balik.

Contoh mencoba menghapus pesanan penjualan dari tabel Sales.SalesOrderDetail dan menyesuaikan tingkat inventaris produk dalam tabel Product.ProductInventory untuk setiap produk dalam pesanan penjualan. Kueri ini disertakan dalam transaksi karena semua kueri harus berhasil bagi database untuk mencerminkan status pesanan dan ketersediaan produk secara akurat.

Kueri pertama dalam contoh mengambil ID produk dan jumlah untuk ID pesanan penjualan tertentu. Kueri ini bukan bagian dari transaksi. Namun, skrip berakhir jika kueri ini gagal karena ID dan jumlah produk diperlukan untuk menyelesaikan kueri yang merupakan bagian dari transaksi berikutnya.

Kueri berikutnya (penghapusan pesanan penjualan dan pembaruan jumlah inventaris produk) adalah bagian dari transaksi.

Contoh mengasumsikan bahwa SQL Server dan database AdventureWorks diinstal di komputer lokal. Semua output ditulis ke konsol saat contoh dijalankan dari baris perintah.

Kode

<?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));  
}  
  
/* Begin transaction. */  
if( sqlsrv_begin_transaction($conn) === false )   
{   
     echo "Could not begin transaction.\n";  
     die( print_r( sqlsrv_errors(), true));  
}  
  
/* Set the Order ID.  */  
$orderId = 43667;  
  
/* Execute operations that are part of the transaction. Commit on  
success, roll back on failure. */  
if (perform_trans_ops($conn, $orderId))  
{  
     //If commit fails, roll back the transaction.  
     if(sqlsrv_commit($conn))  
     {  
         echo "Transaction committed.\n";  
     }  
     else  
     {  
         echo "Commit failed - rolling back.\n";  
         sqlsrv_rollback($conn);  
     }  
}  
else  
{  
     "Error in transaction operation - rolling back.\n";  
     sqlsrv_rollback($conn);  
}  
  
/*Free connection resources*/  
sqlsrv_close( $conn);  
  
/*----------------  FUNCTION: perform_trans_ops  -----------------*/  
function perform_trans_ops($conn, $orderId)  
{  
    /* Define query to update inventory based on sales order info. */  
    $tsql1 = "UPDATE Production.ProductInventory   
              SET Quantity = Quantity + s.OrderQty   
              FROM Production.ProductInventory p   
              JOIN Sales.SalesOrderDetail s   
              ON s.ProductID = p.ProductID   
              WHERE s.SalesOrderID = ?";  
  
    /* Define the parameters array. */  
    $params = array($orderId);  
  
    /* Execute the UPDATE statement. Return false on failure. */  
    if( sqlsrv_query( $conn, $tsql1, $params) === false ) return false;  
  
    /* Delete the sales order. Return false on failure */  
    $tsql2 = "DELETE FROM Sales.SalesOrderDetail   
              WHERE SalesOrderID = ?";  
    if(sqlsrv_query( $conn, $tsql2, $params) === false ) return false;  
  
    /* Return true because all operations were successful. */  
    return true;  
}  
?>  

Komentar

Untuk tujuan berfokus pada perilaku transaksi, beberapa penanganan kesalahan yang direkomendasikan tidak termasuk dalam contoh sebelumnya. Untuk aplikasi produksi, sebaiknya periksa panggilan apa pun ke fungsi sqlsrv untuk kesalahan dan penanganan yang sesuai.

Lihat Juga

Memperbarui Data (Driver Microsoft untuk PHP untuk SQL Server)

Transaksi (Mesin Database)

Tentang Contoh Kode dalam Dokumentasi