开发者学堂课程【PHP 进阶教程-由浅入深掌握面向对象开发-第三阶段:PDO 事物功能】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/713/detail/12736
PDO 事物功能
内容介绍:
一、前言
二、步骤
三、示例
四、小结
一、前言
1、目标:掌握PDO对于MySQL事务的封装,能够利用PDO实现事务操作需求
2、概念:
PDO事务功能:并非PDO额外多出了一项功能,而是将原来MySQL所支持的事务操作进行了一定的封装实现
(1)事务执行是否成功是由MySQL对应的存储引擎(InnoDB支持)是否支持决定的
(2)PDO只是对具体的操作步骤进行了封装而已(将原先的代码例如beginTransaction()进行封装)
PDO::beginTransaction():开启事务 (MySQL中为start)
PDO:exec():执行事务(写操作)
PDO::rollBack():回滚所有事务
PDO::commit():成功提交所有事务
以上是四个方法,四个方法支持了该操作。其中缺少了两个方法例如回滚点(可以自己操作)
二、步骤
1、初始化数据库操作
2、开启事务
3、执行事务(可能是一些连续的增删改查操作,操作完成后判定事务是否可以提交结果)
4、根据结果选择对事务操作的处理(结果正确提交事务,结果失败回滚事务)
三、示例
1、事务操作的基本实现
#实例化PDO对象
$pdo = new PDO( 'mysql:host=localhost; port=3306; dbname=db_2;charset=utf8' , ' root ' , ' root');
//操作的数据库例如现在为db_2,将代码修改为dbname=db_2。可以补充charset=utf8。如果不编写,那么只需要连接上执行SQL,选择数据库时use db_2,写好该SQL指令,然后使用exec执行即可。字符集类似。
#开启事务
$pdo->beginTransaction() or die('事务开启失败’);
//开启未必成功,需要考虑到数据库是否支持事务
/*
#PDO类内部
public function beginTransaction(){
$sql = ‘start transaction’;
#写方法执行
$res=$this ->exec($sql);
#判定结果
if($res===false)return false;
return true;
}
*/
#执行事务
$pdo->exec( 'insert into t_40 values( )');
//执行事务即是写操作,写好对应的SQL操作,此处不做额外案例。数据库中只需要输入start transaction commit rollback即可。
#连续操作 //执行操作定是连续操作,单个没有必要,只存在成功或失败,本事即是原子性,用不到事务特点:原子性是保证多个步骤同时成功或失败。
#终止事务:判定结果
$pdo->commit();
#成功提交
$pdo->rollback();#
失败回滚
事务操作在真正操作时会出现业务比较多的情况,为了让事务尽可能成功,将过程进行记录,回滚到上一步就用到第二个步骤:
2、在事务操作中,有一种回滚点机制,在PDO中没有实现,如果有必要,可以通过SQL指令设置来实现
#实例化PDO对象
$pdo = new PDO( 'mysql:host=localhost;port=3306; dbname=db_2 ' , ' root ' , ' root');
#开启事务
$pdo->beginTransaction() or die('事务开启失败’);
#执行事务
$pdo->exec( 'insert into t_40 values()' );
#设置回滚点
$pdo->exec( ' savepoint sp1 ');
/*
#封装设置回滚点的函数
function savepoint($pdo,$name){
//需要一个PDO对象执行,提供一个名字
$sql = “savepoint{$name}”;
#执行
$res= $pdo->exec($sql);
//对象方法exec,如果在内部则使用方法this。此处只封装函数
#判定结果
return $res ==== false ? false : true;
//判断恒等于,结果成功返回true,失败返回false
}
*/
#继续执行事务...
#回滚
$pdo->exec( ' rollback to sp1 ' );
//回滚与上述封装类似,使用 rollback to函数,提供回滚点名字,与上述类似执行。
#终止事务
$pdo->commit();
#成功提交
$pdo->rollback();
#失败回滚
PDO只是做了一些伪装,将一些代码固定好例如beginTransaction等。savepoint是因为用户需要传参数,提供名字,所以自己操作。
以上就是回顾点的操作,不做具体代码实现。效果为事物本身操作的效果,掌握事务操作、原理、特性后就可以进行执行。
四、小结
1、事务的本质不是由PDO决定,是由既定SQL指令完成,而事务具体操作内容一定是外部指定的SQL(写操作)来处理(具体例如实现事务insert、update,银行转账updateA减少,updateB增加都为外部指令)
2、PDO提供了事务固定内容的封装,包括开启事务(PDO:beginTransaction())和事务终止(PDO:.commit(和PDO::rollback())。没有对应的savepoint,因为savepoint需要用户参与。
3、回滚点可以通过PDO:.exec()方法写入具体的指令来设定和回滚
4、如果不采用PDO的事务机制,只采用自身的SQL指令:也可以完全利用PDO::exec()来实现.
PDO::exec('start transaction'):开启事务
PDO::exec('commit’):提交事务
PDO::exec('rollback'):回滚事务
以上就是PDO对事务功能提供支持,进行简单封装。