Yii2 事务处理,创建新表后和插入新表数据后就不会回滚 [ 2.0 版本 ]
目前遇到的问题是
加了下面的功能后,就不能回滚,不加之前异常都是可以捕获到,然后回滚的
php版本 5.6.27
mysql版本5.5.53
新加的功能代码如下:
如果我屏蔽下边的语句,发生异常就能回滚
//上边是执行事务
$number =$a->id;//上面获取到自增逐渐
$arr=array('www.1.com','www.2.com','www.3.com');
Yii::$app->db->createCommand("
CREATE TABLE `b_{$number}` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(255) DEFAULT NULL COMMENT '名称',
`domain` varchar(255) DEFAULT '' COMMENT '域名',
`is_delete` int(10) DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `domain` (`domain`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='b表_{$number}';
")->execute();
foreach ($arr as $k=>$v){
$data[] = '("' . 'null' . '", "' . '' . '", "' . $v . '", "' .'0'. '")';
}
$query = "INSERT INTO b_{$a->id} (id,name,domain,is_delete)VALUES" .
implode(',', $data);
$result=$connection->createCommand($query)->execute();
if(!$result){
throw new \Exception('添加失败');
}
//下边捕获异常,try catch
加了的话,不出错误,能正常提交;
如果模拟插入错误,直接抛异常的,而且不能捕获到
求高手大大解答指教。
创建表时会隐式触发COMMIT,现在暂时做法是在事务开始前先创建表,不知道那位大神有在事务里边创建过表的呢?
function actionShiwu() {
// 外部事务
$connection =Yii::$app->db;
$transaction1 = $connection->beginTransaction();
$arr =explode(',', 'http://www.baidu.com,http://www.baidu44.com,http://www.99l.com');
$name ='印度';
$number=22;
try {
$sql1 ="update country set name='{$name}' where code='IN'";
$a=$connection->createCommand($sql1)->execute();
if(!$a){
throw new \Exception('修改失败');
}
// 内部事务
$transaction2 = $connection->beginTransaction();
try {
$result = Yii::$app->db->createCommand("
CREATE TABLE `b_{$number}` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(255) DEFAULT NULL COMMENT '名称',
`domain` varchar(255) DEFAULT '' COMMENT '域名',
`is_delete` int(10) DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `domain` (`domain`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='b表_{$number}';
")->execute();
foreach ($arr as $k=>$v){
$data[] = '("' . 'null' . '", "' . '' . '", "' . $v . '", "' .'0'. '")';
}
$query = "INSERT INTO b_{$number} (id,name,domain,is_delete)VALUES" .
implode(',', $data);
$webDomainSamData=$connection->createCommand($query)->execute();
if(!$webDomainSamData){
throw new \Exception('添加任务网址失败');
}
$transaction2->commit();
} catch (\Exception $e) {
throw $e;
$transaction2->rollBack();
}
$transaction1->commit();
} catch (\Exception $e) {
throw $e;
$transaction1->rollBack();
}
}
//数据表
DROP TABLE IF EXISTS country
;
CREATE TABLE country
(
code
char(2) NOT NULL,
name
char(52) NOT NULL,
population
int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (code
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- Records of country
INSERT INTO country
VALUES ('AU', 'Australia', '18886000');
INSERT INTO country
VALUES ('BR', 'Brazil', '170115000');
INSERT INTO country
VALUES ('CA', 'Canada', '1147000');
INSERT INTO country
VALUES ('CN', 'China', '1277558000');
INSERT INTO country
VALUES ('DE', 'Germany', '82164700');
INSERT INTO country
VALUES ('FR', 'France', '59225700');
INSERT INTO country
VALUES ('GB', 'United Kingdom', '59623400');
INSERT INTO country
VALUES ('IN', '印度333', '1013662000');
INSERT INTO country
VALUES ('RU', 'Russia', '146934000');
INSERT INTO country
VALUES ('US', 'U.S.A', '278357000');
返回错误
Database Exception – yii\db\Exception
SQLSTATE[42000]: Syntax error or access violation: 1305 SAVEPOINT LEVEL1 does not exist
The SQL being executed was: RELEASE SAVEPOINT LEVEL1
Error Info: Array
(
[0] => 42000
[1] => 1305
[2] => SAVEPOINT LEVEL1 does not exist
)
↵
Caused by: PDOException
SQLSTATE[42000]: Syntax error or access violation: 1305 SAVEPOINT LEVEL1 does not exist
in D:\phpStudy\WWW\demo\vendor\yiisoft\yii2\db\Command.php at line 842
最佳答案
-
在catch里打印错误啊 echo array_values($model->getFirstErrors())[0];exit;
共 2 条回复错误还是能看到的,http://www.jb51.net/article/40656.htm 发现含有里边的DDL语句会自动触发commit
其他 3 个回答
新之心
最后登录:2018-07-20
在线时长:14小时40分
- 粉丝0
- 金钱60
- 威望0
- 积分200