天天看點

php 事務處理transaction

MySQL 事務主要用于處理操作量大,複雜度高的資料。比如說,在人員管理系統中,你删除一個人員,你即需要删除人員的基本資料,也要删除和該人員相關的資訊,如信箱,文章等等,這樣,這些資料庫操作語句就構成一個事務!

在MySQL中隻有使用了Innodb資料庫引擎的資料庫或表才支援事務

事務處理可以用來維護資料庫的完整性,保證成批的SQL語句要麼全部執行,要麼全部不執行

事務用來管理insert,update,delete語句

一般來說,事務是必須滿足4個條件(ACID): Atomicity(原子性)、Consistency(穩定性)、Isolation(隔離性)、Durability(持久性)

1、事務的原子性:一組事務,要麼成功;要麼撤回。

2、穩定性 : 有非法資料(外鍵限制之類),事務撤回。

3、隔離性:事務獨立運作。一個事務處理後的結果,影響了其他事務,那麼其他事務會撤回。事務的100%隔離,需要犧牲速度。

4、持久性:一個事務一旦被送出,它對資料庫中資料的改變就是永久的,接下來即使資料庫發生故障也不應該對其有任何影響。

執行下面的程式

m y s q l i = n e w m y s q l i ( ′ l o c a l h o s t ′ , ′ r o o t ′ , ′ m a y i 199 1 ′ , ′ m y s q l d e m o ′ ) ; i f ( mysqli = new mysqli('localhost','root','mayi1991','mysqldemo'); if( mysqli=newmysqli(′localhost′,′root′,′mayi1991′,′mysqldemo′);if(mysqli->connect_error){

die(‘資料庫連接配接錯誤’.$mysqli->connect_error);

}

$sql1 = “update account set balance = balance - 2 where id = 1”;

//這裡故意寫錯指令中的balance1屬性

$sql2 = “update account set balance1 = balance + 2 where id = 2”;

$result1 = m y s q l i − > q u e r y ( mysqli->query( mysqli−>query(sql1);

$result2 = m y s q l i − > q u e r y ( mysqli->query( mysqli−>query(sql2);

if(! r e s u l t 1 ∣ ∣ ! result1 || ! result1∣∣!result2){

die(‘操作錯誤’.$mysqli->error);

}else{

die(‘操作成功’);

}

$mysqli->close();

雖然上面的代碼有報錯,但是在資料庫中,id=1的balance已經改變;這樣就會出現問題;

我們要的同時改變,如果有一個出錯,就不改變;這個時候,我們就需要“事務控制”來保證“一緻性”;

我們需要用到的方法autocommit() commit();看下面的代碼

複制代碼

m y s q l i = n e w m y s q l i ( ′ l o c a l h o s t ′ , ′ r o o t ′ , ′ m a y i 199 1 ′ , ′ m y s q l d e m o ′ ) ; i f ( mysqli = new mysqli('localhost','root','mayi1991','mysqldemo'); if( mysqli=newmysqli(′localhost′,′root′,′mayi1991′,′mysqldemo′);if(mysqli->connect_error){

die(‘資料庫連接配接錯誤’.$mysqli->connect_error);

}

//關閉資料庫自動送出

$mysqli->autocommit(false);

$sql1 = “update account set balance = balance - 2 where id = 1”;

//這裡故意寫錯屬性balance1

$sql2 = “update account set balance1 = balance + 2 where id = 2”;

$result1 = m y s q l i − > q u e r y ( mysqli->query( mysqli−>query(sql1);

$result2 = m y s q l i − > q u e r y ( mysqli->query( mysqli−>query(sql2);

if(! r e s u l t 1 ∣ ∣ ! result1 || ! result1∣∣!result2){

die(‘操作錯誤’.$mysqli->error);

$mysqli->rollback(); //事務回退

}else{

//操作全部正确後再送出

$mysqli->commit();

}

$mysqli->close();

複制代碼

首先利用autocommit(false)方法,關閉資料庫自動送出,然後當操作語句全部成功後,commit()送出到資料庫;

如果操作失敗,我們用rollback()方法回退。