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();
}
}