PHP MySQL Transaction (Begin,Commit,RollBack) |
PHP MySQL Transaction (Begin,Commit,Rollback) ตัวอย่างนี้จะเป็นการเขียนโปรแกรม PHP กับ MySQL ใช้งาน Transaction ในการตรวจสอบความถูกต้องก่อนการทำการบันทึกข้อมูลจริง หลักการคือ เมื่อมีการ Begin แล้ว ภายใต้คำสั่งที่อยู่ในเงื่อนไนนี้จะมีการตรวจสอบว่ามีการทำงานถูกต้อง หรือมีข้อผิดพลาดหรือไม่ ถ้าไม่มีข้อผิดพลาดก็จะทำการ Commit หรือถ้ามีข้อผิดพลาดโปรแกรมจะทำการ Rollback คือยกเลิกข้อมูลที่ได้ทำการกระทำในแต่แรก
Syntax
//*** Start Transaction ***//
mysql_query("BEGIN");
//*** Commit Transaction ***//
mysql_query("COMMIT")
//*** RollBack Tranasction ***//
mysql_query("ROLLBACK")
เพิ่มเติม
ในการใช้งาน Transaction จะต้องกำหนดชนิดของ Table เป็นแบบ InnoDB
InnoDB Syntax
CREATE TABLE `customer` (
.
.
.
.
) ENGINE=InnoDB;
กรณีมีข้อผิดพลาด MySQL said: Documentation
#1289 - The 'InnoDB' feature is disabled; you need MySQL built with 'InnoDB' to have it working
Quote:ให้ทำการเปิดไฟล์ my.ini (C:\AppServ\MySQL\my.ini)
skip-innodb
แก้เป็น
#skip-innodb
### Restart MySQL Service ###
ตัวอย่าง
ตัวอย่างนี้จะเป็นการเพิ่มข้อมูล โดยผมได้สมมุติการเพิ่มข้อมูลซ้ำ ซึ่งมี Primary Key ชื่อ CustomerID ซึ่งจะสามารถเพิ่มข้อมูลสำเร็จใน Statement แรก และ Statement ที่ 2 จะไม่สามารถเพิ่มข้อมูลได้ และเมื่อมีการ RollBack ข้อมูล Statement แรกที่ถูก Insert ไปแล้วก็จะถูกยกเลิกในทันที สำหรับการใช้ Transaction สามารถใช้ได้ทั้งการ Insert/Update/Delete Record
phpMySQLTransactionAddForm.php
<html>
<head>
<title>ThaiCreate.Com PHP & MySQL Tutorial</title>
</head>
<body>
<form action="phpMySQLTransactionAddSave.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
phpMySQLTransactionAddSave.php
<html>
<head>
<title>ThaiCreate.Com PHP & MySQL Tutorial</title>
</head>
<body>
<?php
$objConnect = mysql_connect("localhost","root","root") or die("Error Connect to Database");
$objDB = mysql_select_db("mydatabase");
//*** Start Transaction ***//
mysql_query("BEGIN");
//*** Query 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 = mysql_query($strSQL);
$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 = mysql_query($strSQL);
if(($objQuery1) and ($objQuery2))
{
//*** Commit Transaction ***//
mysql_query("COMMIT");
echo "Save Done.";
}
else
{
//*** RollBack Transaction ***//
mysql_query("ROLLBACK");
echo "Error Save [".$strSQL."]";
}
mysql_close($objConnect);
?>
</body>
</html>
Screenshot
Error MessageError Save [INSERT INTO customer (CustomerID,Name,Email,CountryCode,Budget,Used) VALUES ('C005','Weerachai Nukitram','[email protected]' ,'TH','2000000','100000') ]
Note! สำหรับ function ของ mysql
เนื่องจาก function ของ mysql จะถูก deprecated ใน version ใหม่ ๆ ฉะนั้นแนะนำให้เปลี่ยนไปใช้ function ของ mysqli
อ่านเพิ่มเติม : PHP MySQL Database (mysqli)
|