本文实例讲述了php实现基于pdo的事务处理方法。分享给大家供大家参考,具体如下:
实例1:
try {} catch () {} 形式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
<?php
$dsn = 'mysql:dbname=cheyun_cms;host=127.0.0.1' ;
$user = 'root' ;
$password = '111111' ;
//采用预处理+事务处理执行SQL操作
//1.连接数据库
try {
$pdo = new PDO( $dsn , $user , $password );
$pdo ->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e ) {
die ( "数据库连接失败" . $e ->getMessage());
}
//2.执行数据操作
try {
//开启事物,此时会关闭自动提交
$pdo ->beginTransaction();
$sql = "insert into cy_log (logid, value, action, file) values (?, ?, ?, ?)" ;
$stmt = $pdo ->prepare( $sql );
//传入参数
$stmt ->execute( array (null, "test4" , "w" ,11));
$stmt ->execute( array (null, "test5" , "w" ,11));
$stmt ->execute( array (null, "test3" , "w" ,11));
//提交事物,并且 数据库连接返回到自动提交模式
$pdo ->commit();
} catch (PDOException $e ){
echo '执行失败' . $e ->getMessage();
//如果数据库被设置成自动提交模式,rollback 在回滚事务之后将恢复自动提交模式。
//包括 MySQL 在内的一些数据库, 当在一个事务内有类似删除或创建数据表等 DLL 语句时,会自动导致一个隐式地提交。
//隐式地提交将无法回滚此事务范围内的任何更改。即 DDL 语句无法回滚
$pdo ->rollback();
}
|
实例2:
if…else…形式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
<?php
$dsn = 'mysql:dbname=cheyun_cms;host=127.0.0.1' ;
$user = 'root' ;
$password = '111111' ;
//采用预处理+事务处理执行SQL操作
//1.连接数据库
try {
$pdo = new PDO( $dsn , $user , $password );
} catch (PDOException $e ) {
die ( "数据库连接失败" . $e ->getMessage());
}
//2.执行数据操作
//开启事物
$pdo ->beginTransaction();
$sql = "insert into cy_log (logid, value, action, file) values (?, ?, ?, ?)" ;
$stmt = $pdo ->prepare( $sql );
$datalist = array (
array (null, "test9" , "w" ,11),
array (null, "test10" , "w" ,11),
array (null, "test11" , "w" ,11)
);
//是否提交标志位
$isCommit = true;
foreach ( $datalist as $data ){
$stmt ->execute( $data );
if ( $stmt ->errorCode()>0){
//回滚
$pdo ->rollback();
$isCommit = false;
break ;
}
}
if ( $isCommit ){
//提交事物
$pdo ->commit();
}
|
注意:
数据表需要 InnoDB 类型
希望本文所述对大家PHP程序设计有所帮助。