首先, mysqli 連接是永久連接,而mysql是非永久連接。什麼意思呢? mysql連線每當第二次使用的時候,都會重新開啟一個新的進程,而mysqli則只使用同一個進程,這樣可以很大程度的減輕伺服器端壓力
mysqli封裝了諸如事務等一些高級操作,同時封裝了DB操作過程中的許多可用的方法。
應用比較多的地方是 mysqli的事務。
例如下面的範例:
程式碼如下:
$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 已經很好的封裝了mysql事務的相關操作。如下範例:
程式碼如下:
$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); // 开始事务 $mysqli->query($sql1); $mysqli->query($sql2); if (!$mysqli->errno) { $mysqli->commit(); echo 'ok'; } else { echo 'err'; $mysqli->rollback(); }
在這裡,我們再使用 php mysql 系列函數執行交易。
程式碼如下:
$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:不支援事務,用於只讀程式提高效能
InnoDB:支援ACID事務、行級鎖定、並發
Berkeley DB:支援事務
還有一點要注意:MySQL預設的行為是在每個SQL語句執行後執行一個COMMIT語句,從而有效的將每個語句獨立為一個事務。
但往往,我們需要在使用交易的時候,是需要執行多條sql語句的。這就需要我們手動設定MySQL的autocommit屬性為0,預設為1。
同時,使用START TRANSACTION語句明確的開啟一個交易 。如上面的範例。
如果不這麼做,會有什麼結果呢?
我們將上面第二段程式碼中 //mysql_query(‘SET autocommit=0′); 和 // mysql_query($sql3); 註解去掉,然後執行。
此時,mysql_query($sql3) 執行就不會insert到資料庫。
如果我們將 // mysql_query(‘SET autocommit=1′); 本句註解去掉,那麼mysql_query($sql3); 就會執行成功。
通常COMMIT或ROLLBACK語句執行時才完成一個事務,但有些DDL語句等會隱含觸發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
#UNLOCK TABLES
LOAD MASTER DATA
RENAME TABLE
TRUNCATE TABLE
START TRANSACTION
我們再來舉個例子看下。
程式碼如下:
$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執行出錯了,$sql1照樣會執行的。為什麼呢?
因為rename在執行的時候,mysql預設會先執行commit,再執行rename。
注意
MYSQL中只有INNODB和BDB類型的資料表才能支援事務處理!其他的類型是不支援的!
***:一般MYSQL資料庫預設的引擎是MyISAM,這種引擎不支援交易!如果要讓MYSQL支援事務,可以自己手動修改:
方法如下:1.修改c:/appserv/mysql/my.ini文件,找到skip-InnoDB,在前面加上#,後儲存文件。
2.在執行中輸入:services.msc,重啟mysql服務。
以上是PHP mysql與mysqli事務使用及操作對比的詳細內容。更多資訊請關注PHP中文網其他相關文章!