PHP mysql與mysqli事務(wù)使用說明 分享
mysqli封裝了諸如事務(wù)等一些高級(jí)操作,同時(shí)封裝了DB操作過程中的很多可用的方法。
應(yīng)用比較多的地方是 mysqli的事務(wù)。
比如下面的示例:
$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中,mysqli 已經(jīng)很好的封裝了mysql事務(wù)的相關(guān)操作。如下示例:
$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); // 開始事務(wù)
$mysqli->query($sql1);
$mysqli->query($sql2);
if (!$mysqli->errno) {
$mysqli->commit();
echo 'ok';
} else {
echo 'err';
$mysqli->rollback();
}
在這里,我們再使用 php mysql 系列函數(shù)執(zhí)行事務(wù)。
$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:不支持事務(wù),用于只讀程序提高性能
InnoDB:支持ACID事務(wù)、行級(jí)鎖、并發(fā)
Berkeley DB:支持事務(wù)
還有一點(diǎn)要注意:MySQL默認(rèn)的行為是在每條SQL語句執(zhí)行后執(zhí)行一個(gè)COMMIT語句,從而有效的將每條語句獨(dú)立為一個(gè)事務(wù)。
但往往,我們需要在使用事務(wù)的時(shí)候,是需要執(zhí)行多條sql語句的。這就需要我們手動(dòng)設(shè)置MySQL的autocommit屬性為0,默認(rèn)為1。
同時(shí),使用START TRANSACTION語句顯式的打開一個(gè)事務(wù) 。如上面的示例。
如果不這樣做,會(huì)有什么結(jié)果呢?
我們將上面第二段代碼中 //mysql_query(‘SET autocommit=0′); 和 // mysql_query($sql3); 注釋去掉,然后執(zhí)行。
此時(shí),mysql_query($sql3) 執(zhí)行就不會(huì)insert到數(shù)據(jù)庫中。
如果我們將 // mysql_query(‘SET autocommit=1′); 本句注釋去掉,那么mysql_query($sql3); 就會(huì)執(zhí)行成功。
通常COMMIT或ROLLBACK語句執(zhí)行時(shí)才完成一個(gè)事務(wù),但是有些DDL語句等會(huì)隱式觸發(fā)COMMIT。
比如下列語句
ALTER FUNCTION
ALTER PROCEDURE
ALTER TABLE
BEGIN
CREATE DATABASE
CREATE FUNCTION
CREATE INDEX
CREATE PROCEDURE
CREATE TABLE
DROP DATABASE
DROP FUNCTION
DROP INDEX
DROP PROCEDURE
DROP TABLE
UNLOCK TABLES
LOAD MASTER DATA
LOCK TABLES
RENAME TABLE
TRUNCATE TABLE
SET AUTOCOMMIT=1
START TRANSACTION
我們再來舉個(gè)例子看下。
$sql1 = 'create table ScoreDetail_new(id int)';
$sql2 = 'rename table ScoreDetail to ScoreDetail_bak';
$sql3 = 'rename table ScoreDetail_new to ScoreDetail';
$mysqli = new mysqli('localhost','root','','DB_Lib2Test');
$mysqli->autocommit(false);//開始事物
$mysqli->query($sql1);
$mysqli->query($sql2);
$mysqli->query($sql3);
if (!$mysqli->errno) {
$mysqli->commit();
echo 'ok';
} else {
echo 'err';
$mysqli->rollback();
}
上面的示例中,假如$sql2執(zhí)行出錯(cuò)了,$sql1照樣會(huì)執(zhí)行的。為什么呢?
因?yàn)閞ename在執(zhí)行的時(shí)候,mysql默認(rèn)會(huì)先執(zhí)行commit,再執(zhí)行rename。
注意
MYSQL中只有INNODB和BDB類型的數(shù)據(jù)表才能支持事務(wù)處理!其他的類型是不支持的!
***:一般MYSQL數(shù)據(jù)庫默認(rèn)的引擎是MyISAM,這種引擎不支持事務(wù)!如果要讓MYSQL支持事務(wù),可以自己手動(dòng)修改:
方法如下:1.修改c:/appserv/mysql/my.ini文件,找到skip-InnoDB,在前面加上#,后保存文件。
2.在運(yùn)行中輸入:services.msc,重啟mysql服務(wù)。
3.到phpmyadmin中,mysql->show engines;(或執(zhí)行mysql->show variables like 'have_%'; ),查看InnoDB為YES,即表示數(shù)據(jù)庫支持InnoDB了。
也就說明支持事務(wù)transaction了。
- PHP7使用ODBC連接SQL Server2008 R2數(shù)據(jù)庫示例【基于thinkPHP5.1框架】
- mysqli擴(kuò)展無法在PHP7下升級(jí)問題的解決
- php操作mysqli(示例代碼)
- php使用mysqli向數(shù)據(jù)庫添加數(shù)據(jù)的方法
- PHP入門教程之使用Mysqli操作數(shù)據(jù)庫的方法(連接,查詢,事務(wù)回滾等)
- PHP數(shù)據(jù)庫操作之基于Mysqli的數(shù)據(jù)庫操作類庫
- php封裝的mysqli類完整實(shí)例
- PHP以mysqli方式連接類完整代碼實(shí)例
- php簡單解析mysqli查詢結(jié)果的方法(2種方法)
- PHP基于MySQLI函數(shù)封裝的數(shù)據(jù)庫連接工具類【定義與用法】
- PHP7.0連接DB操作實(shí)例分析【基于mysqli】
相關(guān)文章
PHP實(shí)現(xiàn)將多個(gè)文件中的內(nèi)容合并為新文件的方法示例
這篇文章主要介紹了PHP實(shí)現(xiàn)將多個(gè)文件中的內(nèi)容合并為新文件的方法,涉及php編碼轉(zhuǎn)換、文件與目錄的遍歷以及文件讀寫相關(guān)操作技巧,需要的朋友可以參考下2017-06-06php批量轉(zhuǎn)換文件夾下所有文件編碼的函數(shù)類
分享一個(gè)php轉(zhuǎn)換文件夾下所有文件編碼函數(shù)類,適合發(fā)布網(wǎng)站的其他編碼版本,比如你有一個(gè)GBK版本 你想有一個(gè)UTF8版本 或者你只有GBK的源碼 你想二次開發(fā) 但是你不想改變IDE的編碼方式 你可以用這個(gè)程序?qū)⑵渑哭D(zhuǎn)化為UTF82017-08-08Linux系統(tǒng)下使用XHProf和XHGui分析PHP運(yùn)行性能
這篇文章主要介紹了Linux系統(tǒng)下使用XHProf和XHGui分析PHP運(yùn)行性能的方法,該方案支持Apache與Nginx服務(wù)器及多種數(shù)據(jù)庫環(huán)境,需要的朋友可以參考下2015-12-12PHP模擬asp中response類實(shí)現(xiàn)方法
這篇文章主要介紹了PHP模擬asp中response類的方法,可實(shí)現(xiàn)模擬ASP中response類處理客戶端響應(yīng)的功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08php 批量替換html標(biāo)簽的實(shí)例代碼
這篇文章主要是對php批量替換html標(biāo)簽的實(shí)例代碼進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下,希望對大家有所幫助2013-11-11PHP實(shí)現(xiàn)將Word文件保存到SQL Server數(shù)據(jù)庫
這篇文章主要介紹了如何利用PHP實(shí)現(xiàn)將上傳的Word文件保存到SQL Server數(shù)據(jù)庫,文中的示例代碼講解詳細(xì),需要的可以參考一下2022-02-02php通過正則表達(dá)式記取數(shù)據(jù)來讀取xml的方法
這篇文章主要介紹了php通過正則表達(dá)式記取數(shù)據(jù)來讀取xml的方法,實(shí)例分析了php正則表達(dá)式的技巧及讀取XML文件的方法,需要的朋友可以參考下2015-03-03