>[success] 先引入命名空間 `use sys\Pdo;`
## 手動事務
~~~
Pdo::beginTransaction();
try {
Pdo::execute(
'UPDATE `users` SET credits = credits - :number WHERE uid = :uid',
[
'uid' => $uid,
'number' => $number,
]
);
Pdo::execute(
'INSERT INTO `credits`(`uid`, `number`) VALUES(:uid, :number)',
[
'uid' => $uid,
'number' => -$number,
]
);
// 提交事務
Pdo::commit();
} catch (\Exception $e) {
// 回滾事務
Pdo::rollBack();
throw $e;
}
~~~
## 自動事務 (推薦)
>[info] Pdo::transaction 方法的第二個參數為:是否調試,為 true 時如果SQL執行出錯會拋出錯誤,為 false 時不拋出錯誤。
~~~
public function minusCredits($uid, $number)
{
// 變量轉數組
$data = compact('uid', 'number');
// 執行事務
Pdo::transaction(function () use ($data) {
Pdo::execute(
'UPDATE `users` SET credits = credits - :number WHERE uid = :uid',
[
'uid' => $data['uid'],
'number' => $data['number'],
]
);
Pdo::execute(
'INSERT INTO `credits`(`uid`, `number`) VALUES(:uid, :number)',
[
'uid' => $data['uid'],
'number' => -$data['number'],
]
);
}, true);
}
~~~
## 回滾含有零影響行數的事務
`pdo.transaction.rollback_zero_affected` 配置項為 `true` 時,事務內的任意一條 `SQL` 如果返回的影響行數為零,本次事務將回滾。