【问题标题】:PDO beginTransaction on diferrent classes不同类的 PDO beginTransaction
【发布时间】:2014-03-14 01:01:07
【问题描述】:

您可以原谅我,但据我所知,PDO beginTransaction 用于测试所有必需的查询,如果所有查询都返回成功,它们都会被执行..我说的对吗? 如果是的话,我想问你我是否可以在多个查询中使用它,但不同的类..

我在同一页面上有一个类 Notifications 和一个类 Followers。

class Notifications{

    private $pdo;
    public $now;

public function __construct(){
    $now=time();
    $db = Database::getInstance();
    $this->pdo = $db->getConnection();
}

////////////INSERT NOTIFICATIONS/////////////////////
    public function InsertNoti($toid, $title, $description, $link){
    $sql = "blah blah";
    $result = $this->pdo->prepare($sql);
    $result->execute(array(':toid'=>$toid));
    }
}

和Follow差不多..我想要的是beginTransaction->如果成功则执行Follow->插入通知..是否可以使用beginTransaction或者我必须使用if(successNotification){然后执行follow}?

【问题讨论】:

  • 您是否尝试阅读有关交易的文档?或者探索一些例子?

标签: php class pdo


【解决方案1】:

没有。 PDO::beginTransaction() 开始一个事务。事务中的每个 SQL 语句通常执行,而不是经过测试。如果它们都没有失败,则所有这些都将同时提交或回滚。提交和回滚都可能导致错误,您需要捕获和处理。

在您开始事务后,PDO 对象将等待您发出 PDO::commit() 或 PDO::rollback()。在开始和结束交易之间做什么并不重要,尽管您希望让交易保持尽可能短的时间。你只需要小心不要做任何导致隐式提交的事情。例如,在 MySQL 中,事务中的任何 DDL 都会提交该事务。

目前尚不清楚您要做什么,但其中之一似乎很可能。 (伪代码,为简单起见省略了错误处理。)

begin transaction
insert notification
commit
if no errors, then
begin transaction
insert follow
commit

begin transaction
insert notification
insert follow
commit

您应该仔细阅读PDO docs about transactions

【讨论】:

  • 我可以从第一个查询中获得 lastInsertId() 吗?我需要将它插入到第二个......就像,插入通知,从通知中获取 id,执行“关注”查询
  • 如果有一些方法来搜索文档就好了。 PDO::lastInsertID
猜你喜欢
  • 2013-11-20
  • 2019-03-01
  • 1970-01-01
  • 2021-07-04
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2013-04-29
相关资源
最近更新 更多