PHP的MYSQL事務(wù)處理
MYSQL數(shù)據(jù)庫(kù)從4.1就開始支持事務(wù)功能,據(jù)說5.0將引入存儲(chǔ)過程。
首先要用show engines查看數(shù)據(jù)庫(kù)的引擎,如果InnoDB為DISABLED ,則打開my.ini(集成包可能是my.cnf)文件,找到skip-innodb,前面加上注釋#skip-innodb即可,如果該表不是InnoDB,可用 ALTER TABLE tanlename ENGINE = innodb修改表。
MYSQL的事務(wù)處理主要有兩種方法。
1、用begin,rollback,commit來實(shí)現(xiàn)
begin 開始一個(gè)事務(wù)
rollback 事務(wù)回滾
commit 事務(wù)確認(rèn)
rollback和commit不能并列使用,當(dāng)你同時(shí)使用,只有前面的一個(gè)有效,而后面的無(wú)效,即是你或執(zhí)行commit或執(zhí)行rollback
2、直接用set來改變mysql的自動(dòng)提交模式
MYSQL默認(rèn)是自動(dòng)提交的,也就是你提交一個(gè)QUERY,它就直接執(zhí)行!我們可以通過
set autocommit=0 禁止自動(dòng)提交
set autocommit=1 開啟自動(dòng)提交
來實(shí)現(xiàn)事務(wù)的處理。
但注意當(dāng)你用 set autocommit=0 的時(shí)候,你以后所有的SQL都將做為事務(wù)處理,直到你用commit確認(rèn)或rollback結(jié)束,注意當(dāng)你結(jié)束這個(gè)事務(wù)的同時(shí)也開啟了個(gè)新的事務(wù)!按第一種方法只將當(dāng)前的作為一個(gè)事務(wù)!
個(gè)人推薦使用第一種方法!
MYSQL中只有INNODB和BDB類型的數(shù)據(jù)表才能支持事務(wù)處理!其他的類型是不支持的?。ㄇ杏洠。?br />
下次有空說下MYSQL的數(shù)據(jù)表的鎖定和解鎖!
MYSQL5.0 WINXP下測(cè)試通過
mysql> use test;
Database changed
mysql> CREATE TABLE `dbtest`(
-> id int(4)
-> ) TYPE=INNODB;
Query OK, 0 rows affected, 1 warning (0.05 sec)
mysql> select * from dbtest
-> ;
Empty set (0.01 sec)
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into dbtest value(5);
Query OK, 1 row affected (0.00 sec)
mysql> insert into dbtest value(6);
Query OK, 1 row affected (0.00 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from dbtest;
+------+
| id |
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.00 sec)
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into dbtest values(7);
Query OK, 1 row affected (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from dbtest;
+------+
| id |
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.00 sec)
[PHP]
一、
function Tran( $sql ) {
$judge = 1;
mysql_query('begin');
foreach ($sql as $v) {
if ( !mysql_query($v) ) {
$judge = 0;
}
}
if ($judge == 0) {
mysql_query('rollback');
return false;
}
elseif ($judge == 1) {
mysql_query('commit');
return true;
}
}
二、
<?php
$handler=mysql_connect("localhost","root","");
mysql_select_db("task");
mysql_query("SET AUTOCOMMIT=0");//設(shè)置為不自動(dòng)提交,因?yàn)镸YSQL默認(rèn)立即執(zhí)行
mysql_query("BEGIN");//開始事務(wù)定義
if(!mysql_query("insert into trans (id) values('2')"))
{
mysql_query("ROOLBACK");//判斷當(dāng)執(zhí)行失敗時(shí)回滾
}
if(!mysql_query("insert into trans (id) values('4')"))
{
mysql_query("ROOLBACK");//判斷執(zhí)行失敗回滾
}
mysql_query("COMMIT");//執(zhí)行事務(wù)
mysql_close($handler);
?>
三、使用mysqli做擴(kuò)展,處理事物
mysqli_autocommit($dblink, false);
foreach ($getDatas as $k=>$v){
$urr = user_register($v['u'], md5(time()));
if(!$urr) {
mysqli_rollback($dblink);
}
}
mysqli_commit($dblink);
四、
<?php
$conn=new mysqli("localhost","username","123","mydata");
$conn->query("set names gb2312");
$conn->autocommit(false);
$sql="delete from user_tb where id=1";
$sql1="delete from user1_tb where id=1";
if(!conn-quer($sql)){
$conn->rollback();
}
if(!conn-quer($sql1)){
$conn->rollback();
}
$conn->commit();
$conn->autocommit(true);
?>
另外:
$conn = mysql_connect('localhost','root','root') or die ("數(shù)據(jù)連接錯(cuò)誤!!!");
mysql_select_db('test',$conn);
mysql_query("set names 'GBK'"); //使用GBK中文編碼;
//開始一個(gè)事務(wù)
mysql_query("BEGIN"); //或者mysql_query("START TRANSACTION");
$sql = "INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, 'test1', '0')";
$sql2 = "INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, 'test1', '0')";//這條我故意寫錯(cuò)
$res = mysql_query($sql);
$res1 = mysql_query($sql2);
if($res && $res1){
mysql_query("COMMIT");
echo '提交成功。';
}else{
mysql_query("ROLLBACK");
echo '數(shù)據(jù)回滾。';
}
mysql_query("END");
mysql_query("SET AUTOCOMMIT=0"); //設(shè)置mysql不自動(dòng)提交,需自行用commit語(yǔ)句提交
$sql = "INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, 'test1', '0')";
$sql2 = "INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, 'test1', '0')";//這條我故意寫錯(cuò)
$res = mysql_query($sql);
$res1 = mysql_query($sql2);
if($res && $res1){
mysql_query("COMMIT");
echo '提交成功。';
}else{
mysql_query("ROLLBACK");
echo '數(shù)據(jù)回滾。';
}
mysql_query("END"); //事務(wù)處理完時(shí)別忘記mysql_query("SET AUTOCOMMIT=1");自動(dòng)提交
//MyISAM & InnoDB 都支持,
mysql_query("LOCK TABLES `user` WRITE");//鎖住`user`表
$sql = "INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, 'test1', '0')";
$res = mysql_query($sql);
if($res){
echo '提交成功。!';
}else{
echo '失敗!';
}
mysql_query("UNLOCK TABLES");//解除鎖定