现在是一个电商时代,做电商的首先得有一个商城,所以商城的安全也是不容忽视的,一个数据安全的商城离不开数据库的事务处理,商城在资金、商品、下单、结账等重要步骤加上事务控制这是不一定不可少的,像市场上的一些开源商城我都有去研究,基本像DSMall开源商城之类的这方面都做的很好。
程序员独立开发商城也要注意这方面的事情,现在我这边就介绍下PHP操作MySQL事务的方法,分享给大家供大家参考。具体方法如下:
一般来说,事务都应该具备ACID特征。所谓ACID是Atomic(原子性),Consistent(一致性),Isolated(隔离性),Durable(持续性)四个词的首字母所写,下面以“银行转帐”为例来分别说明一下它们的含义:
① 原子性:组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。换句话说,事务是不可分割的最小单元。比如:银行转帐过程中,必须同时从一个帐户减去转帐金额,并加到另一个帐户中,只改变一个帐户是不合理的。
② 一致性:在事务处理执行前后,数据库是一致的。也就是说,事务应该正确的转换系统状态。比如:银行转帐过程中,要么转帐金额从一个帐户转入另一个帐户,要么两个帐户都不变,没有其他的情况。
③ 隔离性:一个事务处理对另一个事务处理没有影响。就是说任何事务都不可能看到一个处在不完整状态下的事务。比如说,银行转帐过程中,在转帐事务没有提交之前,另一个转帐事务只能处于等待状态。
④ 持续性:事务处理的效果能够被永久保存下来。反过来说,事务应当能够承受所有的失败,包括服务器、进程、通信以及媒体失败等等。比如:银行转帐过程中,转帐后帐户的状态要能被保存下来。
在PHP中,mysqli 已经很好的封装了mysql事务的相关操作。如下示例:
$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);//开始事物
m
y
s
q
l
i
−
>
q
u
e
r
y
(
mysqli->query(
mysqli−>query(sql1);
m
y
s
q
l
i
−
>
q
u
e
r
y
(
mysqli->query(
mysqli−>query(sql2);
if(!$mysqli->errno){
$mysqli->commit();
echo ‘ok’;
}else{
echo ‘err’;
$mysqli->rollback();
}
在这里,我们再使用 php mysql 系列函数执行事务。
$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)”;
c
o
n
n
=
m
y
s
q
l
c
o
n
n
e
c
t
(
′
l
o
c
a
l
h
o
s
t
′
,
′
r
o
o
t
′
,
′
′
)
;
m
y
s
q
l
s
e
l
e
c
t
d
b
(
′
D
B
L
i
b
2
T
e
s
t
′
)
;
m
y
s
q
l
q
u
e
r
y
(
′
s
t
a
r
t
t
r
a
n
s
a
c
t
i
o
n
′
)
;
/
/
m
y
s
q
l
q
u
e
r
y
(
′
S
E
T
a
u
t
o
c
o
m
m
i
t
=
0
′
)
;
m
y
s
q
l
q
u
e
r
y
(
conn = mysql_connect('localhost','root',''); mysql_select_db('DB_Lib2Test'); mysql_query('start transaction'); //mysql_query('SET autocommit=0'); mysql_query(
conn=mysqlconnect(′localhost′,′root′,′′);mysqlselectdb(′DBLib2Test′);mysqlquery(′starttransaction′);//mysqlquery(′SETautocommit=0′);mysqlquery(sql1);
mysql_query(
s
q
l
2
)
;
i
f
(
m
y
s
q
l
e
r
r
n
o
(
)
)
m
y
s
q
l
q
u
e
r
y
(
′
r
o
l
l
b
a
c
k
′
)
;
e
c
h
o
′
e
r
r
′
;
e
l
s
e
m
y
s
q
l
q
u
e
r
y
(
′
c
o
m
m
i
t
′
)
;
e
c
h
o
′
o
k
′
;
/
/
m
y
s
q
l
q
u
e
r
y
(
′
S
E
T
a
u
t
o
c
o
m
m
i
t
=
1
′
)
;
/
/
m
y
s
q
l
q
u
e
r
y
(
sql2); if(mysql_errno ()){ mysql_query('rollback'); echo 'err'; }else{ mysql_query('commit'); echo 'ok'; } // mysql_query('SET autocommit=1'); // mysql_query(
sql2);if(mysqlerrno())mysqlquery(′rollback′);echo′err′;elsemysqlquery(′commit′);echo′ok′;//mysqlquery(′SETautocommit=1′);//mysqlquery(sql3);
PHP商城数据库安全事务处理方法
最新推荐文章于 2021-10-08 09:46:13 发布