事务处理

框架为DAO提供了一套简单的事务处理机制,默认是关闭的,可以通过Datebase::start()方法开启

注意:请确保连接的数据表是innodb的存储引擎,否者事务并不会生效。

Datebase::start()之后可以通过Datebase::commit()来进行完整事务的提交保存,但并不会影响start之前的操作

同理,可以通过Datebase::rollback()进行整个事务的回滚,回滚所有当前未提交的事务

当程序调用Datebase::end()方法后事务会全部终止,未提交的事务也会自动回滚,另外,程序析构时,也会自动回滚未提交的事务

  1. // 在事务开始前的操作都会默认提交,num:0
  2. $this->testDAO->filter(['id'=>1])->update(['num'=>0]);
  3. // 开始事务
  4. Database::start();
  5. // set num = num+2
  6. $this->testDAO->filter(['id'=>1])->update(['num'=>['+'=>1]]);
  7. $this->testDAO->filter(['id'=>1])->update(['num'=>['+'=>1]]);
  8. // 回滚事务
  9. Database::rollback();
  10. // 当前num还是0
  11. $num = $this->testDAO->filter(['id'=>1])->find()['num'];
  12. // set num = num+2
  13. $this->testDAO->filter(['id'=>1])->update(['num'=>['+'=>1]]);
  14. $this->testDAO->filter(['id'=>1])->update(['num'=>['+'=>1]]);
  15. // 提交事务
  16. Database::commit();
  17. // num = 2
  18. $num = $this->testDAO->filter(['id'=>1])->find()['num'];
  19. // 关闭事务
  20. Database::end();

另外,事务的开启并不会影响select操作,只对增加,删除,修改操作有影响