標籤:attr 操作 local 支付 china 語句 blog new else
這幾天做支付的時候,又用到了事物,為了方便自己以後查看,今天閑的沒事就把以前的東西整理下。(其中引用別人的東西,在這裡謝謝他們貢獻的代碼!)
一、交易處理概述:
事務:是若干事件的集合
交易處理:當所有事件執行成功,事務才執行;若有任何一個事件不能成功執行,事務的其它事件也不被執行。
只要你的MySQL版本支援BDB或InnoDB表類型,那麼你的MySQL就具有交易處理的能力。這裡面,又以InnoDB表類型用的最多,下面就以InnoDB表類型為例簡單說一下MySQL中的交易處理。
二、MYSQL的交易處理主要有兩種方法。
1、用begin,rollback,commit來實現
begin 開始一個事務
rollback 交易回復
commit 事務確認
2、直接用set來改變mysql的自動認可模式
MYSQL預設是自動認可的,也就是你提交一個QUERY,它就直接執行!我們可以通過
set autocommit=0 禁止自動認可
set autocommit=1 開啟自動認可
———————————————————————————————————————————————————————————————————————————————
PHP中的PDO的事物:(這裡我只是整理了下,引用的原文地址:http://www.poluoluo.com/jzxy/201410/315255.html)
try{ $pdo=new PDO("mysql:host=localhost;dbname=psp","root",""); $pdo->exec("set names utf8"); $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);//設定異常處理模式 $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);//關閉自動認可 }catch(PDOException $e){ echo "資料庫連接失敗"; exit; } try{ $age=10; $pdo->beginTransaction();//開始事務 $affected_rows1=$pdo->exec("update kfry set k_age=k_age+{$age} where k_name=‘user1‘"); $affected_rows2=$pdo->exec("update kfry set k_age=k_age-{$age} where k_name=‘user2‘");//隨意更改使之執行成功或失敗 /* if($affected_rows1&&$affected_rows2) { $pdo->commit(); echo "操作成功"; }else{ $pdo->rollback(); } */ if(!$affected_rows1) throw new PDOException("加入錯誤"); if(!$affected_rows2) throw new PDOException("減少錯誤"); echo "操作成功"; $pdo->commit();//如果執行到此處前面兩個更新sql語句執行成功,整個事務執行成功 }catch(PDOException $e){ echo "操作失敗:".$e->getMessage(); $pdo->rollback();//執行事務中的語句出了問題,整個事務全部撤銷 } $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,1);
Mysql中的事物:(自己整理別人的,原文地址:https://my.oschina.net/u/162418/blog/314498)
<?php//資料庫連接$conn = mysql_connect(‘localhost‘, ‘root‘, ‘‘);mysql_select_db(‘test‘, $conn);mysql_query("SET NAMES GBK");/*支援事務的表必須是InnoDB類型一段事務中只能出現一次:mysql_query(‘START TRANSACTION‘);//開始事務mysql_query(‘ ROLLBACK ‘);//復原事務mysql_query(‘COMMIT‘);//提交事務如果一段事務中出現多次復原事務,則在,提交事務時只將第一次復原前至開始事務後對資料庫的所有操作取消,第一次復原後至提交事務前所有對資料庫操作仍將有效,所以一般將復原語句僅放在提交事務語句前如果一段事務無提交語句,則從開始事務時以下的所有對資料庫操作雖執行(執行方法返回對錯),但對資料庫無影響,但是在執行下段開始事務語句時,前段事務自動認可*/mysql_query(‘START TRANSACTION‘);$isBad = 0;$ins_testTable1 = "INSERT INTO testtable1(NAME,age)VALUES(‘first‘,23)";if(!mysql_query($ins_testTable1)){ $isBad =1;}//插入語句欄位名有錯$ins_testTable2 = "INSERT INTO testtable1(NAME,ages)VALUES(‘second‘,‘24‘)";if(!mysql_query($ins_testTable2)){ $isBad =1;}if($isBad == 1){ echo $isBad; mysql_query(‘ROLLBACK ‘);}mysql_query(‘COMMIT‘);mysql_close($conn);?>
PHP和Mysql事物處理