日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql事务嵌套 php_使用以下代码,MySQL中的PHP“嵌套”事务是否...

發(fā)布時間:2024/7/19 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql事务嵌套 php_使用以下代码,MySQL中的PHP“嵌套”事务是否... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

好的,我正在尋找使用PHP在MySQL中進(jìn)行“嵌套”事務(wù)的解決方案,并且正如您在MySQL文檔中所知的那樣,不可能在事務(wù)內(nèi)進(jìn)行事務(wù)(Mysql transactions within transactions).我試圖使用http://php.net/manual/en/pdo.begintransaction.php中建議的Database類,但不幸的是,這對我來說是錯誤的,因為它的計數(shù)器范圍是對象級別而不是類級別,為了解決此問題,我創(chuàng)建了具有計數(shù)器(名為$nest)的此類(TransactionController)靜態(tài)的,它帶來了使事務(wù)“線性”(帶有“線性”)所需的類級別:我說的是:它顯然是嵌套的,但是如果您看起來它不是嵌套的,那么事務(wù)將運(yùn)行良好,您認(rèn)為呢? ?(最后看例子,車主)

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:靜態(tài)屬性$warn_rollback_was_thrown已添加到TransactionController,以警告事務(wù)在執(zhí)行的某個時刻失敗,但沒有回滾.

UPDATE2:當(dāng)事務(wù)在某個時刻失敗時,您可以使用forceRollback()讓代碼仍然運(yùn)行到最后或最終停止它,例如,請參見以下代碼:

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();

}

} ?>

總結(jié)

以上是生活随笔為你收集整理的mysql事务嵌套 php_使用以下代码,MySQL中的PHP“嵌套”事务是否...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。