关于数据回滚的应用
2017-08-08 15:44:25
杨桢
  • 访问次数: 55
  • 注册日期: 2017-06-29
  • 最后登录: 2017-10-11
  • 当前积分: 997
  • 门派等级: 无门派

然之开源程序代码中(专业版的没见过,不清楚),所有涉及到多表分步操作的地方并没有实现事务处理。

比如填写出差申请时,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();

杨桢 最后编辑, 2017-08-08 15:45:20
沙发
2017-08-08 18:39:34
石洋洋
  • 访问次数: 165
  • 注册日期: 2015-12-11
  • 最后登录: 2017-10-23
  • 当前积分: 657
  • 门派等级: 无门派
谢谢反馈,我们记录一下。
板凳
2017-08-09 10:41:31
王春生
  • 访问次数: 901
  • 注册日期: 2014-05-02
  • 最后登录: 2017-10-08
  • 当前积分: 1224
  • 门派等级: 无门派
一般来说mysql的myisam格式还是值得信赖的。
1/1