首頁  >  文章  >  後端開發  >  PHP mysql與mysqli事務使用及操作對比

PHP mysql與mysqli事務使用及操作對比

巴扎黑
巴扎黑原創
2017-05-26 16:12:411571瀏覽

首先, 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

SET AUTOCOMMIT=1

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服務。

3.到phpmyadmin中,mysql->show engines;(或執行mysql->show variables like 'have_%'; ),查看InnoDB為YES,即表示資料庫支援InnoDB了。 ###也就說明支援事務transaction了。 ###

以上是PHP mysql與mysqli事務使用及操作對比的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn