欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP mysql與mysqli事務使用說明 分享

 更新時間:2013年08月17日 12:17:39   作者:  
首先, 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 系列函數執(zhí)行事務。

復制代碼 代碼如下:

$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事務、行級鎖、并發(fā)
Berkeley DB:支持事務
還有一點要注意:MySQL默認的行為是在每條SQL語句執(zhí)行后執(zhí)行一個COMMIT語句,從而有效的將每條語句獨立為一個事務。

但往往,我們需要在使用事務的時候,是需要執(zhí)行多條sql語句的。這就需要我們手動設置MySQL的autocommit屬性為0,默認為1。

同時,使用START TRANSACTION語句顯式的打開一個事務 。如上面的示例。

如果不這樣做,會有什么結果呢?

我們將上面第二段代碼中 //mysql_query(‘SET autocommit=0′); 和 // mysql_query($sql3); 注釋去掉,然后執(zhí)行。

此時,mysql_query($sql3) 執(zhí)行就不會insert到數據庫中。

如果我們將 // mysql_query(‘SET autocommit=1′); 本句注釋去掉,那么mysql_query($sql3); 就會執(zhí)行成功。

通常COMMIT或ROLLBACK語句執(zhí)行時才完成一個事務,但是有些DDL語句等會隱式觸發(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

我們再來舉個例子看下。

復制代碼 代碼如下:

$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í)行出錯了,$sql1照樣會執(zhí)行的。為什么呢?

因為rename在執(zhí)行的時候,mysql默認會先執(zhí)行commit,再執(zhí)行rename。

注意

MYSQL中只有INNODB和BDB類型的數據表才能支持事務處理!其他的類型是不支持的!

***:一般MYSQL數據庫默認的引擎是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,即表示數據庫支持InnoDB了。
也就說明支持事務transaction了。

相關文章

  • PHP實現(xiàn)將多個文件中的內容合并為新文件的方法示例

    PHP實現(xiàn)將多個文件中的內容合并為新文件的方法示例

    這篇文章主要介紹了PHP實現(xiàn)將多個文件中的內容合并為新文件的方法,涉及php編碼轉換、文件與目錄的遍歷以及文件讀寫相關操作技巧,需要的朋友可以參考下
    2017-06-06
  • php 更新數據庫中斷的解決方法

    php 更新數據庫中斷的解決方法

    使用PHP程序更新數據庫,總是到160000條時中斷, 查看LOG,顯示超過PHP最大執(zhí)行時間的錯誤, 只需要在PHP腳本中加入如下語句
    2009-06-06
  • php批量轉換文件夾下所有文件編碼的函數類

    php批量轉換文件夾下所有文件編碼的函數類

    分享一個php轉換文件夾下所有文件編碼函數類,適合發(fā)布網站的其他編碼版本,比如你有一個GBK版本 你想有一個UTF8版本 或者你只有GBK的源碼 你想二次開發(fā) 但是你不想改變IDE的編碼方式 你可以用這個程序將其批量轉化為UTF8
    2017-08-08
  • Linux系統(tǒng)下使用XHProf和XHGui分析PHP運行性能

    Linux系統(tǒng)下使用XHProf和XHGui分析PHP運行性能

    這篇文章主要介紹了Linux系統(tǒng)下使用XHProf和XHGui分析PHP運行性能的方法,該方案支持Apache與Nginx服務器及多種數據庫環(huán)境,需要的朋友可以參考下
    2015-12-12
  • 定義php常量的詳解

    定義php常量的詳解

    本篇文章是對定義php常量進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • PHP模擬asp中response類實現(xiàn)方法

    PHP模擬asp中response類實現(xiàn)方法

    這篇文章主要介紹了PHP模擬asp中response類的方法,可實現(xiàn)模擬ASP中response類處理客戶端響應的功能,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • php 批量替換html標簽的實例代碼

    php 批量替換html標簽的實例代碼

    這篇文章主要是對php批量替換html標簽的實例代碼進行了詳細的介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-11-11
  • PHP實現(xiàn)將Word文件保存到SQL Server數據庫

    PHP實現(xiàn)將Word文件保存到SQL Server數據庫

    這篇文章主要介紹了如何利用PHP實現(xiàn)將上傳的Word文件保存到SQL Server數據庫,文中的示例代碼講解詳細,需要的可以參考一下
    2022-02-02
  • php通過正則表達式記取數據來讀取xml的方法

    php通過正則表達式記取數據來讀取xml的方法

    這篇文章主要介紹了php通過正則表達式記取數據來讀取xml的方法,實例分析了php正則表達式的技巧及讀取XML文件的方法,需要的朋友可以參考下
    2015-03-03
  • 使用php將字符串拆分成數組的幾種常見方法

    使用php將字符串拆分成數組的幾種常見方法

    經常會遇到要把字符串分割成數組的情況,在Java中只要調用split(",")方法就能把字符串分割成數組,在JS中也很簡單同樣也是調用split( "," )方法就可以做到,在php中調用什么方法分割字符串呢?所以本小編給大家介紹了使用php將字符串拆分成數組的幾種方法
    2023-11-11

最新評論