事務操作一般情況下只是在數(shù)據(jù)庫層面上體現(xiàn),在PHP中是沒有事務概念的。常用的數(shù)據(jù)庫MySQL,SQLServer,Oracle等都支持事務處理。:)
10年的陽西網(wǎng)站建設經(jīng)驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。全網(wǎng)整合營銷推廣的優(yōu)勢是能夠根據(jù)用戶設備顯示端的尺寸不同,自動調(diào)整陽西建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)公司從事“陽西網(wǎng)站設計”,“陽西網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
其實很簡單就是SQL語句,在執(zhí)行事務前使用Begin Trans(說明不同的數(shù)據(jù)庫事務處理不同,思路相同)
然后進行事務處理,如果成功則Commit提交事務,如果失敗可以使用Rollback回滾事務。
希望對你有幫助。
近來稍有時間研究了下MYSQL中的事務操作,在很多場合下很是適用,譬如在注冊的時候需要初始化很多張關聯(lián)表的時候,問答回復的時候需要至少同時操作兩張表,這些都會在某些時候只能成功更新一張表,而另外的SQL語句出現(xiàn)錯誤,正常的操作會導致初始化了一張表
,其他的都木有能初始化,這個時候就會導致用戶表里的用戶信息已經(jīng)執(zhí)行插入,導致提示注冊失敗,但是用戶已經(jīng)注冊了部分信息,這個時候需要程序員去數(shù)據(jù)庫刪除相應的數(shù)據(jù)是一個比較不好的事情。
因此這邊考慮使用事務,事務可以進行模擬SQL操作,當所有的SQL都操作成功的時候才進行SQL操作,只要有一個操作失敗就回滾當前事務的所有SQL操作,避免出現(xiàn)上面描述中出現(xiàn)的數(shù)據(jù)寫入不完整等情況。
下面是鄙人寫的一小段代碼,歡迎大家參考和提出意見:
復制代碼
代碼如下:
/**
*
@todo
多條sql的事務處理
*
@param
$sqls
array
*
@return
boole
true/false
*/
public
function
doArraySqlActionsTran($password,$sqls){
$db
=
$this
-
doSqlLink($password);//打開數(shù)據(jù)庫鏈接
$db
-
autocommit(FALSE);//設置為不自動提交,因為MYSQL默認立即執(zhí)行
//獲取SQL執(zhí)行結果數(shù)組
for
($i=0;$icount($sqls);$i++){
$result[$i]
=
$db
-
query($sqls[$i]);
}
//解析SQL執(zhí)行結果數(shù)組
for
($j=0;$jcount($result);$j++){
if
($result[$j]==FALSE){
$result[$j]='false';
}else{
$result[$j]='true';
}
}
//查找SQL結果數(shù)組中是否存在false結果集
if
(in_array('false',$result)){
$sqlResult=FALSE;
}else{
$sqlResult==TRUE;
}
//根據(jù)結果集進行數(shù)據(jù)庫回滾或者執(zhí)行操作
if
($sqlResult==FALSE){
$db
-
rollback();//判斷當執(zhí)行失敗時回滾
$return=FALSE;//
正式環(huán)境中使用
//$return='ROOLBACK';//test
標記使用
}else{
$db
-
commit();//執(zhí)行事務s
$return=TRUE;//
正式環(huán)境中使用
//$return='COMMIT';//test
標記使用
}
$db-autocommit(true);
//設置為非自動提交——事務處理
$db-close();//關閉連接
return
$return;
}
到此事務執(zhí)行批量SQL操作基本完成,謝謝大家!
事務是tran
不是trin
begin
tran
delete
from
a
where
uid='002'
delete
from
b
where
uid='002'
commit
tran
如果沒有特殊需要,不必使用rollback
tran,執(zhí)行兩個表刪除的時候,如果遇到某個語句出錯,都會自動回滾的。
PHP與MYSQL事務處理
/*
MYSQL的事務處理主要有兩種方法。
1、用begin,rollback,commit來實現(xiàn)
begin 開始一個事務
rollback 事務回滾
commit 事務確認
2、直接用set來改變mysql的自動提交模式
MYSQL默認是自動提交的,也就是你提交一個QUERY,它就直接執(zhí)行!我們可以通過
set autocommit=0 禁止自動提交
set autocommit=1 開啟自動提交
來實現(xiàn)事務的處理。
當你用 set autocommit=0 的時候,你以后所有的SQL都將做為事務處理,直到你用commit確認或rollback結束。
注意當你結束這個事務的同時也開啟了個新的事務!按第一種方法只將當前的作為一個事務!
個人推薦使用第一種方法!
MYSQL中只有INNODB和BDB類型的數(shù)據(jù)表才能支持事務處理!其他的類型是不支持的!
***:一般MYSQL數(shù)據(jù)庫默認的引擎是MyISAM,這種引擎不支持事務!如果要讓MYSQL支持事務,可以自己手動修改:
方法如下:1.修改c:\appserv\mysql\my.ini文件,找到skip-InnoDB,在前面加上#,后保存文件。
2.在運行中輸入:services.msc,重啟mysql服務。
3.到phpmyadmin中,mysql-show engines;(或執(zhí)行mysql-show variables like 'have_%'; ),查看InnoDB為YES,即表示數(shù)據(jù)庫支持InnoDB了。
也就說明支持事務transaction了。
4.在創(chuàng)建表時,就可以為Storage Engine選擇InnoDB引擎了。如果是以前創(chuàng)建的表,可以使用mysql-alter table table_name type=InnoDB;
或 mysql-alter table table_name engine=InnoDB;來改變數(shù)據(jù)表的引擎以支持事務。
*/
/*************** transaction--1 ***************/
$conn = mysql_connect('localhost','root','root') or die ("數(shù)據(jù)連接錯誤!!!");
mysql_select_db('test',$conn);
mysql_query("set names 'GBK'"); //使用GBK中文編碼;
//開始一個事務
mysql_query("BEGIN"); //或者mysql_query("START TRANSACTION");
$sql = "INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, 'test1', '0')";
$sql2 = "INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, 'test1', '0')";//這條我故意寫錯
$res = mysql_query($sql);
$res1 = mysql_query($sql2);
if($res $res1){
mysql_query("COMMIT");
echo '提交成功。';
}else{
mysql_query("ROLLBACK");
echo '數(shù)據(jù)回滾。';
}
mysql_query("END");
/**************** transaction--2 *******************/
/*方法二*/
mysql_query("SET AUTOCOMMIT=0"); //設置mysql不自動提交,需自行用commit語句提交
$sql = "INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, 'test1', '0')";
$sql2 = "INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, 'test1', '0')";//這條我故意寫錯
$res = mysql_query($sql);
$res1 = mysql_query($sql2);
if($res $res1){
mysql_query("COMMIT");
echo '提交成功。';
}else{
mysql_query("ROLLBACK");
echo '數(shù)據(jù)回滾。';
}
mysql_query("END"); //事務處理完時別忘記mysql_query("SET AUTOCOMMIT=1");自動提交
/******************對于不支持事務的MyISAM引擎數(shù)據(jù)庫可以使用表鎖定的方法:********************/
//MyISAM InnoDB 都支持,
/*
LOCK TABLES可以鎖定用于當前線程的表。如果表被其它線程鎖定,則造成堵塞,直到可以獲取所有鎖定為止。
UNLOCK TABLES可以釋放被當前線程保持的任何鎖定。當線程發(fā)布另一個LOCK TABLES時,或當與服務器的連接被關閉時,所有由當前線程鎖定的表被隱含地解鎖。
*/
mysql_query("LOCK TABLES `user` WRITE");//鎖住`user`表
$sql = "INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, 'test1', '0')";
$res = mysql_query($sql);
if($res){
echo '提交成功。!';
}else{
echo '失敗!';
}
mysql_query("UNLOCK TABLES");//解除鎖定
MyISAM 是MySQL中默認的存儲引擎,一般來說不是有太多人關心這個東西。決定使用什么樣的存儲引擎是一個很tricky的事情,但是還是值我們?nèi)パ芯恳幌?,這里的文章只考慮 MyISAM 和InnoDB這兩個,因為這兩個是最常見的。
事務處理具有四個特性:原子性、一致性、獨立性、持久性。
并不是所有的數(shù)據(jù)庫都支持事務處理的,PDO 為能夠執(zhí)行事務處理的數(shù)據(jù)庫提供事務支持。
配置事務處理需注意:
1、關閉 PDO 的自動提交;
$pdo-setAttribute(PDO::ATTR_AUTOCOMMIT, false);
2、開啟一個事務需要的方法;
$pdo-beginTransaction(); // 開啟一個事務
$pdo-commit(); // 提交事務
$pdo-rollback(); // 回滾事務
3、一般事務處理是運行在 try...catch...語句中,當事務失敗時執(zhí)行 catch 代碼段。
php
try {
$pdo-beginTransaction(); // 開啟一個事務
$row = null;
$row = $pdo-exec("xxx"); // 執(zhí)行第一個 SQL
if (!$row)
throw new PDOException('提示信息或執(zhí)行動作'); // 如出現(xiàn)異常提示信息或執(zhí)行動作
$row = $pdo-exec("xxx"); // 執(zhí)行第二個 SQL
if (!$row)
throw new PDOException('提示信息或執(zhí)行動作');
$pdo-commit();
} catch (PDOException $e) {
$pdo-rollback(); // 執(zhí)行失敗,事務回滾
exit($e-getMessage());
}
?
在事務中的 SQL 語句,如果出現(xiàn)錯誤,那么所有的 SQL 都不執(zhí)行。當所有 SQL 有無誤的時候,才提交執(zhí)行。
建議用 行鎖+事務
select * from table where id=‘92’ for update
這樣的話 只有獲得本次數(shù)據(jù)庫鏈接的資源號的 php 程序可以對本條記錄進行讀取操作,其他程序如果也有讀取的話會等待鎖定該行的程序執(zhí)行更新后,才能讀取,
另外 貌似對數(shù)據(jù)庫引擎有要求 mysql 的話 innodb 可以這樣玩。
本文名稱:php數(shù)據(jù)庫事務處理,php處理數(shù)據(jù)庫的常用函數(shù)
網(wǎng)頁路徑:http://aaarwkj.com/article10/hsoodo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供響應式網(wǎng)站、自適應網(wǎng)站、用戶體驗、營銷型網(wǎng)站建設、標簽優(yōu)化、關鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)