PHP SQL Server Transaction (BEGIN TRAN,COMMIT,ROLLBACK) (mssql) |
PHP SQL Server Transaction (BEGIN TRAN,COMMIT,ROLLBACK) (mssql) ในฟังก์ชั่นของ mssql สามารถทำการการเรียกใช้งาน Transaction ของ SQL Server ได้เช่นเดียวกับในรูปแบบของการเชื่อต่อแบบอื่น ๆ ครับ หลักการทำงานก็เป็นไปตาม Transaction คือ เมื่อต้องการใช้งาน Transaction จะต้องทำการเปิด BEGIN TRAN หลังจากเปิดแล้ว Event ที่เกิดหลังจากนี้จะถูกทำงานภายใต้ Transaction ซึ่งจะยังไม่มีการ Update ข้อมูลจริง แต่ในขณะเดียวกันข้อมูลที่ถูกกระทำภายใต้ Transaction จะสามารถเรียกใช้งานได้ภานใน Process เหมือนกับว่ามีการเกิด Event จริง ๆ แต่ถ้าเมื่อมีการ COMMIT ข้อมูลถูกอย่างก็จะถูกบันทึกตามเหตุการณ์ หรือ ROLLBACK เพื่อยกเลิกการกระทำทั้งหมด
ตัวอย่าง
phpSQLServerTransactionAddForm.php
<html>
<head>
<title>ThaiCreate.Com PHP & SQL Server Tutorial</title>
</head>
<body>
<form action="phpSQLServerTransactionAddSave.php" name="frmAdd" method="post">
<table width="600" border="1">
<tr>
<th width="91"> <div align="center">CustomerID </div></th>
<th width="160"> <div align="center">Name </div></th>
<th width="198"> <div align="center">Email </div></th>
<th width="97"> <div align="center">CountryCode </div></th>
<th width="70"> <div align="center">Budget </div></th>
<th width="70"> <div align="center">Used </div></th>
</tr>
<tr>
<td><div align="center"><input type="text" name="txtCustomerID" size="5"></div></td>
<td><input type="text" name="txtName" size="20"></td>
<td><input type="text" name="txtEmail" size="20"></td>
<td><div align="center"><input type="text" name="txtCountryCode" size="2"></div></td>
<td align="right"><input type="text" name="txtBudget" size="5"></td>
<td align="right"><input type="text" name="txtUsed" size="5"></td>
</tr>
</table>
<input type="submit" name="submit" value="submit">
</form>
</body>
</html>
Screenshot
phpSQLServerTransactionAddSave.php
<html>
<head>
<title>ThaiCreate.Com PHP & SQL Server Tutorial</title>
</head>
<body>
<?php
$objConnect = mssql_connect("nb-werachain","sa","") or die("Error Connect to Database");
$objDB = mssql_select_db("mydatabase");
mssql_query("BEGIN TRAN");
$strSQL = "INSERT INTO customer ";
$strSQL .="(CustomerID,Name,Email,CountryCode,Budget,Used) ";
$strSQL .="VALUES ";
$strSQL .="('".$_POST["txtCustomerID"]."','".$_POST["txtName"]."','".$_POST["txtEmail"]."' ";
$strSQL .=",'".$_POST["txtCountryCode"]."','".$_POST["txtBudget"]."','".$_POST["txtUsed"]."') ";
$objQuery = mssql_query($strSQL);
if($objQuery)
{
mssql_query("COMMIT");
echo "Save Done.";
}
else
{
mssql_query("ROLLBACK");
echo "Error Save [".$strSQL."]";
}
mssql_close($objConnect);
?>
</body>
</html>
คำอธิบาย
จากตัวอย่างผมได้ยกเพียงการ Insert ข้อมูลเท่านั้นครับ คือถ้าการ Insert ข้อมูลผ่านก็ให้ทำการ COMMIT หรือถ้ามีข้อผิดพลาดให้ทำการยกเลิกข้อมูลโดย ROLLBACK ในการใช้งาน Transaction นั้นนิยมใช้ในต่อเมื่อมี Process ที่มากกว่า 1 Process ครับ เช่น การเพิ่มข้อมูล Table 1 และ Table 2 หรือ 3 โดยเมื่อ Process ใด Process หนึ่งทำงานผิดพลาด ก็ให้ทำการยกเลิกข้อมูลทั้งหมด
Transaction Flow
BEGIN TRAN
Process 1
.
.
.
Error -> ROLLBACK
Process 2
.
.
.
Error -> ROLLBACK
Process 3
.
.
.
Error -> ROLLBACK
.
.
No Error -> COMMIT
ถ้า Apply กับตัวอย่างที่ผมได้ยกขึ้นมาก็จะเขียนได้เป็น
<html>
<head>
<title>ThaiCreate.Com PHP & SQL Server Tutorial</title>
</head>
<body>
<?php
$objConnect = mssql_connect("nb-werachain","sa","") or die("Error Connect to Database");
$objDB = mssql_select_db("mydatabase");
mssql_query("BEGIN TRAN");
//**** Process 1 ****//
$strSQL = "INSERT INTO customer ";
$strSQL .="(CustomerID,Name,Email,CountryCode,Budget,Used) ";
$strSQL .="VALUES ";
$strSQL .="('".$_POST["txtCustomerID"]."','".$_POST["txtName"]."','".$_POST["txtEmail"]."' ";
$strSQL .=",'".$_POST["txtCountryCode"]."','".$_POST["txtBudget"]."','".$_POST["txtUsed"]."') ";
$objQuery1 = mssql_query($strSQL);
if(!$objQuery1)
{
mssql_query("ROLLBACK");
echo "Error Save [".$strSQL."]";
exit();
}
//**** Process 2 ****//
$strSQL = "INSERT INTO customer ";
$strSQL .="(CustomerID,Name,Email,CountryCode,Budget,Used) ";
$strSQL .="VALUES ";
$strSQL .="('".$_POST["txtCustomerID"]."','".$_POST["txtName"]."','".$_POST["txtEmail"]."' ";
$strSQL .=",'".$_POST["txtCountryCode"]."','".$_POST["txtBudget"]."','".$_POST["txtUsed"]."') ";
$objQuery2 = mssql_query($strSQL);
if(!$objQuery2)
{
mssql_query("ROLLBACK");
echo "Error Save [".$strSQL."]";
exit();
}
//**** Process 3 ****//
$strSQL = "INSERT INTO customer ";
$strSQL .="(CustomerID,Name,Email,CountryCode,Budget,Used) ";
$strSQL .="VALUES ";
$strSQL .="('".$_POST["txtCustomerID"]."','".$_POST["txtName"]."','".$_POST["txtEmail"]."' ";
$strSQL .=",'".$_POST["txtCountryCode"]."','".$_POST["txtBudget"]."','".$_POST["txtUsed"]."') ";
$objQuery3 = mssql_query($strSQL);
if(!$objQuery3)
{
mssql_query("ROLLBACK");
echo "Error Save [".$strSQL."]";
exit();
}
//**** Commit Transaction ****//
if(($objQuery1) and ($objQuery2) and ($objQuery3))
{
mssql_query("COMMIT");
}
mssql_close($objConnect);
?>
</body>
</html>
Screenshot
SQL Server 2005
SQL Server 2008
Note! สำหรับ function ของ mssql
|