thinkphp中的事务操作
1、事务的概念:
事务是由单独单元的一个或多个SQL语句组成,在这个单元中,每个mysql语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中的某条sql语句一旦执行失败或产生错误,整个事务会发生回滚。所有收到影响的数据将返回到事务以前的状态。如果整个单元的所有sql语句均执行成功,则事务顺利执行。
2、事务的四个特性
ACID
原子性:确保工作单元内的所有操作都成功完成,否则事务将被中止在故障点,和以前的操作将回滚到以前的状态。
一致性:确保数据库正确地改变状态后,成功提交的事务。
持久性:一旦提交了这个事务之后对数据的修改更新是永久的。
隔离性:使事务操作彼此独立和透明。
3、事务的整个过程
use databases;//开始使用某个数据库
start transaction;//开启事务
insert into stu1 values();//进行相关操作
commit;//提交事务
rollback;//回滚(撤销事务)
4、thinkphp中的事务操作
使用事务处理的话,需要数据库引擎支持事务处理。比如 MySQL 的 MyISAM 不支持事务处理,需要使用 InnoDB 引擎。
使用 transaction 方法操作数据库事务,当发生异常会自动回滚。
ThinkPHP提供了单数据库的事务支持。
启动事务:
$User->startTrans();
提交事务:
$User->commit();
事务回滚:
$User->rollback();
事务是针对数据库本身的,所以可以跨模型操作的 。
测试举例:
public function testTrans(){ $domain = new Domain(); $domain->startTrans();//开启事务 try{ $hostInfo = Host::get(['host_ip'=>'127.0.0.1']); $hostId = $hostInfo->host_id; $time = date("Y-m-d H:i:s"); $domain->data([ 'domain_name'=>'11111','exp_id'=>'4','user_id'=>'2', 'host_id'=>$hostId,'domain_status'=>1,'course_id'=>'0' ]); $domain->save(); $instance = new ImageInstanceModel(); $instance->data([ 'image_course_id'=>'2222' ]); $instance->save(); }catch (\Exception $e){ $domain->rollback(); } $is = 1; if($is == 1){ $domain->rollback(); }else{ $domain->commit(); } }