2017-07-20 11:54:33 5587次浏览 4条回答 0 悬赏 10 金钱

目前遇到的问题是
加了下面的功能后,就不能回滚,不加之前异常都是可以捕获到,然后回滚的
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 

加了的话,不出错误,能正常提交;
如果模拟插入错误,直接抛异常的,而且不能捕获到

求高手大大解答指教。

补充于 2017-07-24 09:02

创建表时会隐式触发COMMIT,现在暂时做法是在事务开始前先创建表,不知道那位大神有在事务里边创建过表的呢?

补充于 2017-07-24 14:08

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

最佳答案

您需要登录后才可以回答。登录 | 立即注册
新之心
见习主管

新之心

注册时间:2017-07-02
最后登录:2018-07-20
在线时长:14小时40分
  • 粉丝0
  • 金钱60
  • 威望0
  • 积分200

热门问题