我有多個類方法,每個方法在引發異常時都使用事務和回滾。下面的基本示例。包裝使用事務的類方法
class TaskMapper
{
private $dblayer;
public function __construct(PDO $dblayer)
{
$this->dblayer = $dblayer;
}
public function save(Task $task)
{
try {
$this->dblayer->beginTransaction();
$stmt = ... // query/queries here
$stmt->execute();
$stmt2 = ... // query/queries here
$stmt2->execute();
$this->dblayer->commit();
} catch (\PDOException $e) {
$this->dblayer->rollBack();
// deal with exception here
}
}
public function editField($id, $field, $value)
{
try {
$this->dblayer->beginTransaction();
$stmt = ... // query/queries here
$stmt->execute();
$stmt2 = ... // query/queries here
$stmt2->execute();
$stmt->execute();
$this->dblayer->commit();
} catch (\PDOException $e) {
$this->dblayer->rollBack();
// deal with exception here
}
}
}
現在,我寫它利用包含類似於上述代碼中的多個類方法cron作業的腳本 - 與交易和回滾和異常。
例如:
if (date('j') == '1') {
// reset monthly count column
$task->editField(17, 'monthly_count', '0');
}
$task->save($task);
這是一個非常剝去例子,但我想知道是否有可能來包裝一個try/catch塊中的單個事務中的所有方法的調用,在捕獲中回滾?因此,將上面的代碼封裝在一個try/catch中,並在catch中使用事務和回滾?
如果不是,處理這種情況的最好方法是如果一個方法調用失敗,其他方法必須回滾。
在此先感謝。
對於我來說,save()方法的存在意味着所有數據庫事務都將從該調用中處理。到那時爲止,變化只在php對象級別完成。 save()的作用是保持更改並因此將所有查詢包裝到單個事務中。 – Shadow