Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
SQL Server için PHP için Microsoft Sürücüleri'nin SQLSRV sürücüsü, işlemleri gerçekleştirmek için üç işlev sağlar:
PDO_SQLSRV sürücüsü, işlemleri gerçekleştirmek için üç yöntem sağlar:
Bir örnek için bkz. PDO::beginTransaction .
Bu konunun geri kalanında işlemleri gerçekleştirmek için SQLSRV sürücüsünün nasıl kullanılacağı açıklanır ve gösterilir.
Açıklamalar
İşlem yürütme adımları aşağıdaki gibi özetlenebilir:
İşlemi sqlsrv_begin_transaction ile başlatın.
İşlemin parçası olan her sorgunun başarısını veya başarısızlığını denetleyin.
Uygunsa, işlemi sqlsrv_commit ile işleyin. Aksi takdirde, sqlsrv_rollback ile işlemi geri alın. sqlsrv_commit veya sqlsrv_rollback çağrıldıktan sonra sürücü otomatik işleme moduna döndürülür.
Varsayılan olarak, SQL Server için PHP için Microsoft Sürücüleri otomatik işleme modundadır. Bu, sqlsrv_begin_transaction kullanılarak açık bir işlemin parçası olarak belirlenmediği sürece tüm sorguların otomatik olarak başarı üzerine işlendiği anlamına gelir.
Açık bir işlem sqlsrv_commit ile işlenmediyse, bağlantı kapatıldığında veya betiğin sonlandırıldığında geri alınır.
İşlemleri gerçekleştirmek için eklenmiş Transact-SQL kullanmayın. Örneğin, bir işlemi başlatmak için Transact-SQL sorgusu olarak "BEGIN TRANSACTION" içeren bir deyim yürütmeyin. İşlemleri gerçekleştirmek için katıştırılmış Transact-SQL kullandığınızda beklenen işlem davranışı garanti edilemez.
Daha önce listelenen sqlsrv işlevleri, işlemleri gerçekleştirmek için kullanılmalıdır.
Example
Description
Aşağıdaki örnek, bir işlemin parçası olarak birkaç sorgu yürütür. Tüm sorgular başarılı olursa işlem işlenir. Sorgulardan herhangi biri başarısız olursa işlem geri alınır.
Örnek, Sales.SalesOrderDetail tablosundan bir satış siparişini silmeyi ve satış siparişindeki her ürün için Product.ProductInventory tablosundaki ürün envanter düzeylerini ayarlamayı dener. Veritabanının siparişlerin durumunu ve ürün kullanılabilirliğini doğru şekilde yansıtması için tüm sorguların başarılı olması gerektiğinden, bu sorgular bir işleme dahil edilir.
Örnekteki ilk sorgu, belirtilen bir satış siparişi kimliği için ürün kimliklerini ve miktarlarını getirir. Bu sorgu işlemin bir parçası değil. Ancak, sonraki işlemin parçası olan sorguları tamamlamak için ürün kimlikleri ve miktarları gerektiğinden bu sorgu başarısız olursa betik sona erer.
Devam eden sorgular (satış siparişinin silinmesi ve ürün envanteri miktarlarının güncelleştirilmesi) işlemin bir parçasıdır.
Örnekte SQL Server ve AdventureWorks veritabanının yerel bilgisayarda yüklü olduğu varsayılır. Örnek komut satırından çalıştırıldığında tüm çıkış konsola yazılır.
Kod
<?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;
}
?>
Comments
İşlem davranışına odaklanmak amacıyla, önerilen bazı hata işleme prosedürleri önceki örnekte yer almamaktadır. Üretim uygulaması için sqlsrv işlevine yapılan tüm çağrıları hataları denetlemenizi ve uygun şekilde işlemenizi öneririz.
Ayrıca Bkz.
Verileri Güncelleştirme (SQL Server için PHP için Microsoft Sürücüleri)