1,首先新建一个mytest数据表,表引擎注意使用的innodb;
CREATE TABLE `mytest` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL DEFAULT '',
`rand_number` int(11) NOT NULL DEFAULT '0' COMMENT '随机数字',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
2,开始测试,这里我使用的thinkphp5.1的框架来测试。
public function test5() {
Db::startTrans();
try {
Db::name('mytest')->insert(['name' => 'one', 'rand_number' => rand(1, 100)]);
call_user_func_array([new self, 'test6'], [1,'zhangsan']);
Db::name('mytest')->insert(['name' => 'two', 'rand_number' => rand(1, 100)]);
Db::commit();
} catch (Exception $e) {
//由于call_user_func_array中调用的回调抛出了异常,所以回滚了。
Db::rollback();
return $e->getMessage();
}
return 'success';
}
public function test6($id,$name) {
Db::startTrans();
try {
Db::name('mytest')->insert(['name' => 'test6', 'rand_number' => rand(1,100)]);
throw new Exception('test6 error');
Db::commit();
} catch (Exception $e) {
Db::rollback();
throw new Exception($e->getMessage());
}
}
3,实验结果是可以接收到回调方法里的异常并回滚数据的。
|