杨桢 |
然之开源程序代码中(专业版的没见过,不清楚),所有涉及到多表分步操作的地方并没有实现事务处理。 比如填写出差申请时,create()函数会先在oa_trip表中创建一条记录。当记录成功后,会再去修改oa_attend表里相关日期的签到状态,但如果此时修改签到状态失败,则并不会回滚已经插入的oa_trip表中的数据。 通过查看lib\base\dao\dao.class.php,发现底层框架提供了begin() rollBack () 和 commit() 三个函数,说明可以实现事务处理。修复方式如下: 1、首先然之数据库表引擎要从MyISAM改为InnoDB,因为前者不支持事务处理。 2、在需要事务回滚的地方,使用上述三个函数。也可利用php的try-catch方式配合使用上面三个函数,可以达到自定义错误,以及错误返回方式,而不是现在的必须用dao::getError()获得。 3、举例:
$_dao = $this->dao; $_dao->begin(); $_dao->create() ...... // 此处正常书写相关sql语句 if ( // 判断条件 ){ $_dao->rollBack(); }
$_dao->commit(); |
石洋洋
|
谢谢反馈,我们记录一下。
|
王春生
|
一般来说mysql的myisam格式还是值得信赖的。
|