本文實例講述了PHP操作MySQL事務的方法,分享給大家供大家參考。具體方法如下:
一般來說,事務都應該具備ACID特征。所謂ACID是Atomic(原子性),Consistent(一致性),Isolated(隔離性),Durable(持續性)四個詞的首字母所寫,下面以“銀行轉帳”為例來分別說明一下它們的含義:
① 原子性:組成事務處理的語句形成了一個邏輯單元,不能只執行其中的一部分。換句話說,事務是不可分割的最小單元。比如:銀行轉帳過程中,必須同時從一個帳戶減去轉帳金額,並加到另一個帳戶中,只改變一個帳戶是不合理的。
② 一致性:在事務處理執行前後,數據庫是一致的。也就是說,事務應該正確的轉換系統狀態。比如:銀行轉帳過程中,要麼轉帳金額從一個帳戶轉入另一個帳戶,要麼兩個帳戶都不變,沒有其他的情況。
③ 隔離性:一個事務處理對另一個事務處理沒有影響。就是說任何事務都不可能看到一個處在不完整狀態下的事務。比如說,銀行轉帳過程中,在轉帳事務沒有提交之前,另一個轉帳事務只能處於等待狀態。
④ 持續性:事務處理的效果能夠被永久保存下來。反過來說,事務應當能夠承受所有的失敗,包括服務器、進程、通信以及媒體失敗等等。比如:銀行轉帳過程中,轉帳後帳戶的狀態要能被保存下來。
在PHP中,mysqli 已經很好的封裝了mysql事務的相關操作。如下示例:
復制代碼 代碼如下:$sql1 = "update User set ScoreCount = ScoreCount +10 where ID= '123456'";
$sql2 = "update ScoreDetail set FScore = 300 where ID= '123456'";
$sql3 = "insert into ScoreDetail ID,Score) values ('123456',60)";
$mysqli = new mysqli('localhost','root','','DB_Lib2Test');
$mysqli->autocommit(false);//開始事物
$mysqli->query($sql1);
$mysqli->query($sql2);
if(!$mysqli->errno){
$mysqli->commit();
echo 'ok';
}else{
echo 'err';
$mysqli->rollback();
}
在這裡,我們再使用 php mysql 系列函數執行事務。
復制代碼 代碼如下:$sql1 = "update User set ScoreCount = ScoreCount +10 where ID= '123456'";
$sql2 = "update ScoreDetail set FScore = 300 where ID= '123456'";
$sql3 = "insert into ScoreDetail ID,Score) values ('123456',60)";
$conn = mysql_connect('localhost','root','');
mysql_select_db('DB_Lib2Test');
mysql_query('start transaction');
//mysql_query('SET autocommit=0');
mysql_query($sql1);
mysql_query($sql2);
if(mysql_errno ()){
mysql_query('rollback');
echo 'err';
}else{
mysql_query('commit');
echo 'ok';
}
// mysql_query('SET autocommit=1');
// mysql_query($sql3);
在這裡要注意:
MyISAM:不支持事務,用於只讀程序提高性能
InnoDB:支持ACID事務、行級鎖、並發
Berkeley DB:支持事務
希望本文所述對大家的PHP+MySQL數據庫程序設計有所幫助。
下面這個,是針對php5的一個簡單數據庫封裝類,適合學習,其他的如刪除、更新等操作,你可以自己加上:
<?php
class Mysql{ //首先定義一個類,首寫字母大寫
public $host;//服務器名,訪問修飾符PUBLIC證明$host是一個公共的屬情在類的內部外部都可訪問,可以被繼承
public $user;//用戶名,是公共的屬性
private $pass;//密碼,問修飾符private證明$pass是私有的.只能在類的內部使用且不能被繼承.
public $dbname;//數據庫名,也是公共的屬性.
//__construct聲名這是一個造函數,定義一些初始的信息.有三個參數
public function __construct($host,$user,$pass,$dbname){
$this->host = $host;
$this->user = $user;
$this->pass = $pass;
$this->dbname = $dbname;
$link = @mysql_connect($this->host,$this->user,$this->pass)
or die("error");
@mysql_select_db($this->dbname,$link)
or die("error2");
}
//定義數據庫的查尋和顯示函數
function myQuery($sql){
$result = mysql_query($sql);
if(!$result){
echo "error3";
exit;
}
$num = mysql_num_rows($result);
if($num){
echo "NO".$num;
}
while($row = mysql_fetch_assoc($result)){
echo '<tr><td bgcolor="#fffddd"><pre>'.htmlspecialchars(stripslashes($row['body']))."<pre></td></tr>";
}
}
}
$rutt = new Mysql('localhost','root','ssss','calvin');//實例化一個類...記住這裡的參數是和構造函數的參數一樣的...
$rutt->myQuery(......余下全文>>
//以下是緩存類:
<?php
class cache {
//緩存目錄
var $cacheRoot = "./cache/";
//緩存更新時間秒數,0為不緩存
var $cacheLimitTime = 0;
//緩存文件名
var $cacheFileName = "";
//緩存擴展名
var $cacheFileExt = "html";
/*
* 構造函數
* int $cacheLimitTime 緩存更新時間
*/
function cache( $cacheLimitTime ) {
if( intval( $cacheLimitTime ) )
$this->cacheLimitTime = $cacheLimitTime;
$this->cacheFileName = $this->getCacheFileName();
//echo $this->cacheFileName;
ob_start();
}
/*
* 檢查緩存文件是否在設置更新時間之內
* 返回:如果在更新時間之內則返回文件內容,反之則返回失敗
*/
function cacheCheck(){
if( file_exists( $this->cacheFileName ) ) {
$cTime = $this->getFileCreateTime( $this->cacheFileName );
if( $cTime + $this->cacheLimitTime > time() ) {
echo file_get_contents( $this->cacheFileName );
ob_end_flush();
exit;
}
}
return false;
}
/*
* 緩存文件或者輸出靜態
* string $staticFileName 靜態文件名(含相對路徑)
*/
function caching( $staticFileName = "" ){
if( $this->cacheFileName ) {
$cacheContent = ob_get_contents();
//echo $cacheContent;
ob_end_flush();
if( $staticFileName ) {
$this->saveFile( $staticFileName, $cacheContent );
}
if( $this->cacheLimitTime )
$this->saveFile( $this->cacheFileName, $cacheContent );
}
}
/*
......余下全文>>