博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】php mysql事务详解
阅读量:5810 次
发布时间:2019-06-18

本文共 2826 字,大约阅读时间需要 9 分钟。

原文转载:

 

在说php mysql事务之前,可以先了解下

在PHP中,mysqli 已经很好的封装了mysql事务的相关操作。如下示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$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 系列函数执行事务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$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);

在这里要注意,

  1. MyISAM:不支持事务,用于只读程序提高性能
  2. InnoDB:支持ACID事务、行级锁、并发
  3. 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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

我们再来举个例子看下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$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执行出错了,$sql1照样会执行的。为什么呢? 
因为rename在执行的时候,mysql默认会先执行commit,再执行rename。

声明:如有转载本博文章,请注明出处。您的支持是我的动力!文章部分内容来自互联网,本人不负任何法律责任。
本文转自bourneli博客园博客,原文链接:
http://www.cnblogs.com/bourneli/articles/2553947.html
,如需转载请自行联系原作者
你可能感兴趣的文章
四、配置开机自动启动Nginx + PHP【LNMP安装 】
查看>>
LNMP一键安装
查看>>
SQL Server数据库概述
查看>>
Linux 目录结构及内容详解
查看>>
startx命令--Linux命令应用大词典729个命令解读
查看>>
华为3026c交换机配置tftp备份命令
查看>>
Oracle命令导入dmp文件
查看>>
OCP读书笔记(24) - 题库(ExamD)
查看>>
Http、TCP/IP协议与Socket之间的区别(转载)
查看>>
解决Unable to load R3 module ...VBoxDD.dll (VBoxDD):GetLastError=1790
查看>>
.net excel利用NPOI导入oracle
查看>>
vrpie在Visio Studio 中无法调试的问题
查看>>
第六课:数据库的基本工具
查看>>
关于二叉树重构的思索
查看>>
$_SERVER['SCRIPT_FLENAME']与__FILE__
查看>>
skynet实践(8)-接入websocket
查看>>
系统版本判断
查看>>
My97DatePicker 日历插件
查看>>
0603 学术诚信与职业道德
查看>>
小点心家族第3位成员——楼层定位效果
查看>>