PHP開啟MySQL事務

2021-09-23 17:27:14 字數 2652 閱讀 3653

<?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命令之間的一系列操作為乙個完整的事務週期。若不執行...