<?php
$db = new mysqli("localhost","root","","test"); //連線資料庫
$db->autocommit(false); //設定為非自動提交——事務處理
$sql1 = "insert into `test`.`test1` (`name` )values ('1' )";
$result1 = $db->query($sql1);
$sql2 = "insert into `test`.`test2` (`a` )values ('1')";
$result2 = $db->query($sql2);
if ($result1 && $result2) else
$db->autocommit(true); //設定為非自動提交——事務處理
$db->close();
?>
1、用begin,rollback,commit來實現
begin 開始乙個事務
rollback 事務回滾
commit 事務確認
2、直接用set來改變mysql的自動提交模式
mysql預設是自動提交的,也就是你提交乙個query,它就直接執行!
set autocommit=0 禁止自動提交
set autocommit=1 開啟自動提交
我們可以通過上面2個命令來實現事務的處理。
當你用 set autocommit=0 的時候,你以後所有的sql都將做為事務處理,直到你用commit確認或rollback結束。
注意當你結束這個事務的同時也開啟了個新的事務,按第一種方法只將當前的作為乙個事務!
注意:mysql中只有innodb和bdb型別的資料表才能支援事務處理,其他的型別是不支援的!一般mysql資料庫預設的引擎是myisam,這種引擎不支援事務!如果要讓mysql支援事務,可以自己手動修改。方法如下:
/*************** transaction--1 ***************/
$conn = mysql_connect('localhost','root','root') or die ("資料連線錯誤!!!");
mysql_select_db('test',$conn);
mysql_query("set names 'gbk'"); //使用gbk中文編碼;
//開始乙個事務
mysql_query("begin"); //或者mysql_query("start transaction");
$sql = "insert into `user` (`id`, `username`, `***`) values (null, 'test1', '0')";
$sql2 = "insert into `user` (`did`, `username`, `***`) values (null, 'test1', '0')";//這條我故意寫錯
$res = mysql_query($sql);
$res1 = mysql_query($sql2);
if($res && $res1)else
mysql_query("end");
/**************** transaction--2 *******************/
mysql_query("set autocommit=0"); //設定mysql不自動提交,需自行用commit語句提交
$sql = "insert into `user` (`id`, `username`, `***`) values (null, 'test1', '0')";
$sql2 = "insert into `user` (`did`, `username`, `***`) values (null, 'test1', '0')";//這條我故意寫錯
$res = mysql_query($sql);
$res1 = mysql_query($sql2);
if($res && $res1)else
mysql_query("end"); //事務處理完時別忘記mysql_query("set autocommit=1");自動提交
/******************對於不支援事務的myisam引擎資料庫可以使用表鎖定的方法:********************/
//myisam & innodb 都支援,
/*lock tables可以鎖定用於當前執行緒的表。如果表被其它執行緒鎖定,則造成堵塞,直到可以獲取所有鎖定為止。
unlock tables可以釋放被當前執行緒保持的任何鎖定。當執行緒發布另乙個lock tables時,或當與伺服器的連線被關閉時,所有由當前執行緒鎖定的表被隱含地解鎖。
*/mysql_query("lock tables `user` write");//鎖住`user`表
$sql = "insert into `user` (`id`, `username`, `***`) values (null, 'test1', '0')";
$res = mysql_query($sql);
if($res)else
mysql_query("unlock tables");//解除鎖定
MySQL開啟事務
什麼是事務?事務是邏輯上的一組操作,組成這組操作的各個單元,要不全都成功要不全都失敗,這個特性就是事務 注意 mysql資料支援事務,但是要求必須是innodb儲存引擎 解決這個問題 mysql的事務解決這個問題,因為mysql的事務特性,要求這組操作,要不全都成功,要不全都失敗,這樣就避免了某個操...
php開啟mysql擴充套件
對於lamp的安裝,我一般情況下都是選擇,先安裝php再安裝mysql,php原始碼中自帶了mysqlnd,使用起來很方便。但是其實並不是說一定要使用mysqlnd 比如我安裝php的時候沒有開啟mysql的擴充套件,此時又當如何給php新增功能呢?我們可以通過php擴充套件的普遍安裝方法操作,也就...
MYSQL事務的開啟與提交
對於乙個mysql資料庫 innodb 事務的開啟與提交模式無非下面這兩種情況 1 若引數autocommit 0,事務則在使用者本次對資料進行操作時自動開啟,在使用者執行commit命令時提交,使用者本次對資料庫開始進行操作到使用者執行commit命令之間的一系列操作為乙個完整的事務週期。若不執行...