两周前才开始接触tp5。刚接触tp5.0的事务回滚。
环境:1. mysql使用的默认引擎是InnoDB 。2.前后使用的是同一个连接。3. 我要做的是批量插入数据,一条条检查,没错插入;有错回滚,之前的插入作废。4. 现在做的这个项目是tp5.0
1. 开始时因为不了解,每条检查完没问题时,插入该条数据,并“Db::commit();”,所以失败了。
事后总结:
1. Db::commit();//整个事务执行成功,可以理解为整个事务执行完了,我这里应该批量插入数据完成后再用这个方法,不应该插入一条commit()一下。
2. Db::rollback();//整个事务全部撤销,我是在检查数据时,不合格时用的,紧跟着return ‘xxxxxxxxx’;没问题。
3. Db::startTrans(); // 启动事务。
4. 按着ctrl,然后点击commit()这个方法,发现没有跳到commit()这个方法的定义处。跳到Db.class里,ctrl+f也搜不到commit()。其他两个方法也找不到。 但可以用,
可以这样用
。没问题。
2. 就是因为失败了, 之后又找不到commit()等方法,所以在tp5.1,自己写的demo中,各种试,还是不行。
事后总结:
1. tp5.1 有那三个方法。
2. 是数据库的表有问题,导致在tp5.0的项目里的都搞好了,tp5.1的还是不行。自己的demo用的数据库是我不知道从哪来的。一直都不认为表有问题,各种误解。
3. 把表导出来。
CREATE TABLE `think_data` (
`id` int(255) NOT NULL,
`data` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=29 DEFAULT CHARSET=utf8;
这样的才对
ENGINE=InnoDB DEFAULT CHARSET=utf8;
是表的问题,和tp5事务基础知识不了解的问题。
Db::startTrans(); // 启动事务
Db::table('think_data')->insert(['id'=>28,'data'=>'thinkphp']);
Db::table('think_data')->insert(['id'=>1,'data'=>'thinkphp']);
Db::rollback();
正常的话,不报错(数据库没有id为1,28的数据),这两条插入语句不会起作用。
版权声明:本文为dw33xn原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。