当前位置:首页 > 关于Phalcon 事务管理(Transactions)的使用

关于Phalcon 事务管理(Transactions)的使用

发布于 2018-04-25 阅读 4305 次 框架 PHP Phalcon

在Phalcon中,提供事务使用的三种方式:

  • 自定义事务(Manual Transactions)
  • 单独的事务(Isolated Transactions)
  • 隐含的事务(Implicit Transactions)

自定义事务(Manual Transactions)

在controller中的使用

  1. use Phalcon\Mvc\Controller;
  2. class PayController extends Controller
  3. {
  4. public function saveAction()
  5. {
  6. // 开启事务
  7. $this->db->begin();
  8. // db 为services中 di 注入的数据库对象key
  9. // 当有多个数据库连接时,选择你需要的数据库操作对象key(不一定为db)
  10. $pay = new Pay();
  11. $pay->amount = 100;
  12. $pay->created_at = time();
  13. // 支付失败,回滚事务
  14. if ($pay->save() === false) {
  15. $this->db->rollback();
  16. return;
  17. }
  18. $user = new User();
  19. $user->money -= 100;
  20. // 用户金额扣款失败,回滚事务
  21. if ($user->save() === false) {
  22. $this->db->rollback();
  23. return;
  24. }
  25. // 提交事务
  26. $this->db->commit();
  27. }
  28. }

其他方式

  1. use Phalcon\Di;
  2. // 可以通过Di容器获取数据库连接句柄
  3. $db = Di::getDefault()->get('you_need_db_key');
  4. $db->begin();
  5. ...
  6. // 在Model中
  7. $db = $this->getDI()->get('you_need_db_key')
  8. $db->begin();
  9. ...

单独的事务(Isolated Transactions)

单独事务在一个新的连接中执行所有的SQL,虚拟外键检查和业务规则与主数据库连接是相互独立的。 这种事务需要一个事务管理器来全局的管理每一个事务,保证他们在请求结束前能正确的回滚或者提交。

  1. use Phalcon\Mvc\Model\Transaction\Failed as TxFailed;
  2. use Phalcon\Mvc\Model\Transaction\Manager as TxManager;
  3. try {
  4. // 创建一个事物管理
  5. $manager = new TxManager();
  6. // 请求一个事务,默认是请求的 db 连接的事务
  7. $transaction = $manager->get();
  8. // 如果你有多个数据库连接,或者默认数据连接的key不是db,需要通过:
  9. // $txManager->setDbService("db_name_key") 指定你需要的数据库
  10. $pay = new Pay();
  11. $pay->setTransaction($transaction);
  12. $pay->amount = 100;
  13. $pay->created_at = time();
  14. if ($pay->save() === false) {
  15. // rollback 会抛出一个 TxFailed 失败异常
  16. $transaction->rollback("支付失败,事务回滚");
  17. }
  18. $user = new User();
  19. $user->setTransaction($transaction);
  20. $user->money -= 100;
  21. if ($user->save() === false) {
  22. $transaction->rollback("用户扣款失败,事务回滚");
  23. }
  24. // 提交事务
  25. $transaction->commit();
  26. } catch (TxFailed $e) {
  27. // 捕获失败回滚的错误
  28. echo "Failed, reason: ", $e->getMessage();
  29. // 进行失败后的业务处理
  30. ...
  31. }

隐含的事务(Implicit Transactions)

隐含的事务比较简单,可以直接通过orm直接使用。这里不做过多赘述

  1. $user = new User();
  2. $user->money -= 100;
  3. $pay = new Pay();
  4. $pay->amount = 100;
  5. $pay->created_at = time();
  6. if($pay->save() === false){
  7. //失败处理
  8. ...
  9. } else {
  10. //成功处理
  11. ...
  12. }