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

來源:互聯網
上載者:User
首先, 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
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了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.