mysql事务嵌套 php_使用以下代码,MySQL中的PHP“嵌套”事务是否...
好的,我正在尋找使用PHP在MySQL中進行“嵌套”事務的解決方案,并且正如您在MySQL文檔中所知的那樣,不可能在事務內進行事務(Mysql transactions within transactions).我試圖使用http://php.net/manual/en/pdo.begintransaction.php中建議的Database類,但不幸的是,這對我來說是錯誤的,因為它的計數器范圍是對象級別而不是類級別,為了解決此問題,我創建了具有計數器(名為$nest)的此類(TransactionController)靜態的,它帶來了使事務“線性”(帶有“線性”)所需的類級別:我說的是:它顯然是嵌套的,但是如果您看起來它不是嵌套的,那么事務將運行良好,您認為呢? ?(最后看例子,車主)
class TransactionController extends \\PDO {
public static $warn_rollback_was_thrown = false;
public static $transaction_rollbacked = false;
public function __construct()
{
parent :: __construct( ... connection info ... );
}
public static $nest = 0;
public function reset()
{
TransactionController :: $transaction_rollbacked = false;
TransactionController :: $warn_rollback_was_thrown = false;
TransactionController :: $nest = 0;
}
function beginTransaction()
{
$result = null;
if (TransactionController :: $nest == 0) {
$this->reset();
$result = parent :: beginTransaction();
}
TransactionController :: $nest++;
return $result;
}
public function commit()
{
$result = null;
if (TransactionController :: $nest == 0 &&
!TransactionController :: $transaction_rollbacked &&
!TransactionController :: $warn_rollback_was_thrown) {
$result = parent :: commit();
}
TransactionController :: $nest--;
return $result;
}
public function rollback()
{
$result = null;
if (TransactionController :: $nest >= 0) {
if (TransactionController :: $nest == 0) {
$result = parent :: rollback();
TransactionController :: $transaction_rollbacked = true;
}
else {
TransactionController :: $warn_rollback_was_thrown = true;
}
}
TransactionController :: $nest--;
return $result;
}
public function transactionFailed()
{
return TransactionController :: $warn_rollback_was_thrown === true;
}
// to force rollback you can only do it from $nest = 0
public function forceRollback()
{
if (TransactionController :: $nest === 0) {
throw new \PDOException();
}
}
}
class CarData extends TransactionController {
public function insertCar()
{
try {
$this->beginTransaction();
... (operations) ...
$this->commit();
}
catch (\PDOException $e) {
$this->rollback();
}
}
}
class PersonData extends TransactionController {
public function insertPerson( $person=null )
{
try {
$this->beginTransaction();
... (operations) ...
$this->commit();
}
catch (\PDOException $e) {
$this->rollback();
}
}
}
class CarOwnerData extends TransactionController {
public function createOwner()
{
try {
$this->beginTransaction();
$car = new CarData();
$car->insertCar();
$person = new PersonData();
$person->insertPerson();
... (operations) ...
$this->commit();
}
catch (\PDOException $e) {
$this->rollback();
}
}
}
$sellCar = new CarOwnerData();
$sellCar->createOwner();
UPDATE1:靜態屬性$warn_rollback_was_thrown已添加到TransactionController,以警告事務在執行的某個時刻失敗,但沒有回滾.
UPDATE2:當事務在某個時刻失敗時,您可以使用forceRollback()讓代碼仍然運行到最后或最終停止它,例如,請參見以下代碼:
public function insertMultiplePersons( $arrayPersons )
{
try {
$this->beginTransaction();
if (is_array( $arrayPersons )) {
foreach ($arrayPersons as $k => $person) {
$this->insertPerson( $person );
if ($this->transactionFailed()) {
$this->forceRollback();
}
}
}
$this->commit();
}
catch (\PDOException $e) {
$this->rollback();
}
} ?>
總結
以上是生活随笔為你收集整理的mysql事务嵌套 php_使用以下代码,MySQL中的PHP“嵌套”事务是否...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++ map初始化同时赋值_Golan
- 下一篇: 微信小程序js数组初始化_微信小程序学习