步驟: 1.開啟事務 start transaction 當我們開啟一個事務的時候,我們對sql的操作都發生在記憶體中,但是沒有真正的反饋到資料庫磁碟的文件中! 2.回滾 rollback 回滾,就是恢復到事務開啟之前的最原始的狀態! 註意:回滾操作會自動的關閉一個事務,如果想再次執行事務,需要重新開 ...
步驟:
1.開啟事務 start transaction
當我們開啟一個事務的時候,我們對sql的操作都發生在記憶體中,但是沒有真正的反饋到資料庫磁碟的文件中!
2.回滾 rollback
回滾,就是恢復到事務開啟之前的最原始的狀態!
註意:回滾操作會自動的關閉一個事務,如果想再次執行事務,需要重新開啟事務!
3.提交 commit
事務的基本原理
普通的執行,之所以是立即執行並生效,因為預設的,MySQL對sql語句的執行是自動提交的!所以,開啟一個事務的本質,就是關閉了以前的自動提交的功能,而是由用戶手動提交(利用commit語句)!
總結事務的步驟:
1, 開啟事務
2, 如果執行成功,就提交commit
3, 如果有任何一條sql語句執行失敗,則回滾rollback!
事務處理最典型的就是借還錢。下麵以張三向李四還1000元為例
首先查看資料庫中各自的錢數
下麵是處理還錢事務的代碼:
<?php /** * MySQL實現事務操作 */ echo "<meta charset=utf-8>"; // 1 連接資料庫 $link = @mysql_connect('localhost','root','') or die('連接資料庫失敗'); mysql_select_db('test',$link); mysql_query('set names utf8'); // 2 開啟事務 mysql_query("start transaction"); //設置一個變數,用來判斷所有sql語句是否成功 $flag = true; // 2.1執行事務中的一組sql語句
// 李四的money+1000 $sql = "update pdo set mone=money+1000 where name='李四'"; $res = mysql_query($sql); if (!$res) { //若sql語句執行失敗,把$falg設置為false $flag = false; } //張三的money-1000 $sql = "update pdo set money=money-1000 where name='張三'"; $res = mysql_query($sql); if (!$res) { //若sql語句執行失敗,把$falg設置為false $flag = false; } // 2.2 判斷事務是否執行成功 if ($flag) { //所有sql語句執行成功,把sql語句提交 mysql_query('commit'); echo "還錢成功!"; }else{ // 如其中一條執行失敗,則回滾到事務開啟之前的狀態 mysql_query('rollback'); echo "還錢失敗!"; }
結果:
下麵,我們故意把其中一個欄位寫錯,看看事務是否正常處理,資料庫中的錢數是否有變化!
// 李四的money+1000 $sql = "update pdo set mone=money+1000 where name='李四'"; //把moeny欄位錯寫成mone
結果:
結果是還錢失敗,並且資料庫中各自的錢數沒有變化,說明當某一條語句未執行成功時,事物不會提交,而會回滾,把數據恢復到開始事務之前的原始狀態,這也是使用事務的作用,即只有當事務中所有sql語句全部執行成功,事務才會提交,否則會回滾!
下篇會介紹PDO中事務處理