国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

PHP mysql與mysqli事務使用說明

2024-05-04 21:49:13
字體:
來源:轉載
供稿:網友

首先,mysqli 連接是永久連接,而mysql是非永久連接,什么意思呢?mysql連接每當第二次使用的時候,都會重新打開一個新的進程,而mysqli則只使用同一個進程,這樣可以很大程度的減輕服務器端壓力.

mysqli封裝了諸如事務等一些高級操作,同時封裝了DB操作過程中的很多可用的方法,應用比較多的地方是 mysqli的事務,比如下面的示例,代碼如下:

  1. $mysqli = new mysqli('localhost','root','','DB_Lib2Test'); 
  2. $mysqli->autocommit(false);//開始事物 
  3. $mysqli->query($sql1); 
  4. $mysqli->query($sql2); 
  5. if(!$mysqli->errno){ 
  6.   $mysqli->commit(); 
  7.   echo 'ok'
  8. }else
  9.  echo 'err'
  10.   $mysqli->rollback(); 

在PHP中,mysqli 已經很好的封裝了mysql事務的相關操作,如下示例:

  1. $sql1 = "update User set ScoreCount = ScoreCount +10 where ID= '123456'"
  2. $sql2 = "update ScoreDetail  set FScore = 300 where ID= '123456'"
  3. $sql3 = "insert into  ScoreDetail ID,Score) values ('123456',60)"
  4.  
  5. $mysqli = new mysqli('localhost','root','','DB_Lib2Test'); 
  6. $mysqli->autocommit(false); // 開始事務 
  7. $mysqli->query($sql1); 
  8. //開源代碼Vevb.com 
  9. $mysqli->query($sql2); 
  10. if (!$mysqli->errno) { 
  11.  $mysqli->commit(); 
  12.  echo 'ok'
  13. else { 
  14.  echo 'err'
  15.  $mysqli->rollback(); 

在這里,我們再使用 php mysql 系列函數執行事務,代碼如下:

  1. $sql1 = "update User set ScoreCount = ScoreCount +10 where ID= '123456'"
  2. $sql2 = "update ScoreDetail  set FScore = 300 where ID= '123456'"
  3. $sql3 = "insert into  ScoreDetail ID,Score) values ('123456',60)"
  4.  
  5. $conn = mysql_connect('localhost','root',''); 
  6. mysql_select_db('DB_Lib2Test'); 
  7. mysql_query('start transaction'); 
  8. //mysql_query('SET autocommit=0'); 
  9.  
  10. mysql_query($sql1); 
  11. mysql_query($sql2); 
  12. if (mysql_errno()) { 
  13.  mysql_query('rollback'); 
  14.  echo 'err'
  15. else { 
  16.  mysql_query('commit'); 
  17.  echo 'ok'
  18.  
  19. // mysql_query('SET autocommit=1'); 
  20. // 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.

比如下列語句:

  1. ALTER FUNCTION 
  2. ALTER PROCEDURE 
  3. ALTER TABLE 
  4. BEGIN 
  5. CREATE DATABASE 
  6. CREATE FUNCTION 
  7. CREATE INDEX 
  8. CREATE PROCEDURE 
  9. CREATE TABLE 
  10. DROP DATABASE 
  11. DROP FUNCTION 
  12. DROP INDEX 
  13. DROP PROCEDURE 
  14. DROP TABLE 
  15. UNLOCK TABLES 
  16. LOAD MASTER DATA 
  17. LOCK TABLES 
  18. RENAME TABLE 
  19. TRUNCATE TABLE 
  20. SET AUTOCOMMIT=1 
  21. START TRANSACTION 

我們再來舉個例子看下,代碼如下:

  1. $sql1 = 'create table ScoreDetail_new(id int)'
  2. $sql2 = 'rename table ScoreDetail to ScoreDetail_bak'
  3. $sql3  = 'rename table ScoreDetail_new to ScoreDetail'
  4.  
  5. $mysqli = new mysqli('localhost','root','','DB_Lib2Test'); 
  6. $mysqli->autocommit(false);//開始事物 
  7. $mysqli->query($sql1); 
  8. $mysqli->query($sql2); 
  9. $mysqli->query($sql3); 
  10. if (!$mysqli->errno) { 
  11. //開源代碼Vevb.com 
  12.  $mysqli->commit(); 
  13.  echo 'ok'
  14. else { 
  15.  echo 'err'
  16.  $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了.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安丘市| 靖安县| 鄂温| 马山县| 城口县| 庄浪县| 仙居县| 普兰店市| 云霄县| 甘德县| 长岛县| 南京市| 涞源县| 平江县| 沂水县| 苍梧县| 成安县| 徐水县| 偃师市| 甘泉县| 晋州市| 八宿县| 高唐县| 大同市| 新化县| 泾源县| 博兴县| 赤壁市| 大悟县| 岗巴县| 华宁县| 林周县| 平阴县| 富平县| 伊金霍洛旗| 小金县| 鄯善县| 额尔古纳市| 康平县| 肥城市| 疏附县|