中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

PHP中實現MySQL嵌套事務的兩種解決方案
來源:易賢網 閱讀:1273 次 日期:2015-02-11 15:01:04
溫馨提示:易賢網小編為您整理了“PHP中實現MySQL嵌套事務的兩種解決方案”,方便廣大網友查閱!

一、問題起源

在MySQL的官方文檔中有明確的說明不支持嵌套事務:

代碼如下:

Transactions cannot be nested. This is a consequence of the implicit commit performed for any current transaction when you issue a START TRANSACTION statement or one of its synonyms.

但是在我們開發一個復雜的系統時難免會無意中在事務中嵌套了事務,比如A函數調用了B函數,A函數使用了事務,并且是在事務中調用了B函數,B函數也有一個事務,這樣就出現了事務嵌套。這時候其實A的事務就意義不大了,為什么呢?上面的文檔中就有提到,簡單的翻譯過來就是:

代碼如下:

當執行一個START TRANSACTION指令時,會隱式的執行一個commit操作。

所以我們就要在系統架構層面來支持事務的嵌套。所幸的是在一些成熟的ORM框架中都做了對嵌套的支持,比如doctrine或者laravel。接下來我們就一起來看下這兩個框架是怎樣來實現的。

友情提示,這兩個框架的函數和變量的命名都比較的直觀,雖然看起來很長,但是都是通過命名就能直接得知這個函數或者變量的意思,所以不要一看到那么一大坨就被嚇到了 :)

二、doctrine的解決方案

首先來看下在doctrine中創建事務的代碼(干掉了不相關的代碼):

代碼如下:

public function beginTransaction()

{

++$this->_transactionNestingLevel;

if ($this->_transactionNestingLevel == 1) {

$this->_conn->beginTransaction();

} else if ($this->_nestTransactionsWithSavepoints) {

$this->createSavepoint($this->_getNestedTransactionSavePointName());

}

}

這個函數的第一行用一個_transactionNestingLevel來標識當前嵌套的級別,如果是1,也就是還沒有嵌套,那就用默認的方法執行一下START TRANSACTION就ok了,如果大于1,也就是有嵌套的時候,她會幫我們創建一個savepoint,這個savepoint可以理解為一個事務記錄點,當需要回滾時可以只回滾到這個點。

然后看下rollBack函數:

代碼如下:

public function rollBack()

{

if ($this->_transactionNestingLevel == 0) {

throw ConnectionException::noActiveTransaction();

}

if ($this->_transactionNestingLevel == 1) {

$this->_transactionNestingLevel = 0;

$this->_conn->rollback();

$this->_isRollbackOnly = false;

} else if ($this->_nestTransactionsWithSavepoints) {

$this->rollbackSavepoint($this->_getNestedTransactionSavePointName());

--$this->_transactionNestingLevel;

} else {

$this->_isRollbackOnly = true;

--$this->_transactionNestingLevel;

}

}

可以看到處理的方式也很簡單,如果level是1,直接rollback,否則就回滾到前面的savepoint。

然后我們繼續看下commit函數:

代碼如下:

public function commit()

{

if ($this->_transactionNestingLevel == 0) {

throw ConnectionException::noActiveTransaction();

}

if ($this->_isRollbackOnly) {

throw ConnectionException::commitFailedRollbackOnly();

}

if ($this->_transactionNestingLevel == 1) {

$this->_conn->commit();

} else if ($this->_nestTransactionsWithSavepoints) {

$this->releaseSavepoint($this->_getNestedTransactionSavePointName());

}

--$this->_transactionNestingLevel;

}

算了,不費口舌解釋這段了吧 :)

三、laravel的解決方案

laravel的處理方式相對簡單粗暴一些,我們先來看下創建事務的操作:

代碼如下:

public function beginTransaction()

{

++$this->transactions;

if ($this->transactions == 1)

{

$this->pdo->beginTransaction();

}

}

感覺如何?so easy吧?先判斷當前有幾個事務,如果是第一個,ok,事務開始,否則就啥都不做,那么為啥是啥都不做呢?繼續往下看rollBack的操作:

代碼如下:

public function rollBack()

{

if ($this->transactions == 1)

{

$this->transactions = 0;

$this->pdo->rollBack();

}

else

{

--$this->transactions;

}

}

明白了吧?只有當當前事務只有一個的時候才會真正的rollback,否則只是將計數做減一操作。這也就是為啥剛才說laravel的處理比較簡單粗暴一些,在嵌套的內層里面實際上是木有真正的事務的,只有最外層一個整體的事務,雖然簡單粗暴,但是也解決了在內層新建一個事務時會造成commit的問題。原理就是這個樣子了,為了保持完整起見,把commit的代碼也copy過來吧!

代碼如下:

public function commit()

{

if ($this->transactions == 1) $this->pdo->commit();

--$this->transactions;

}

更多信息請查看IT技術專欄

更多信息請查看數據庫
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
欧美片在线观看| 亚洲宅男天堂在线观看无病毒| 国产主播精品在线| 欧美日韩另类在线| 免费观看日韩| 欧美在线视频网站| 亚洲影院在线观看| 亚洲国产精品女人久久久| 欧美伦理a级免费电影| 麻豆精品视频在线| 欧美在线视频一区二区三区| 最近看过的日韩成人| 黄色成人免费网站| 国产原创一区二区| 国产亚洲午夜高清国产拍精品| 麻豆亚洲精品| 久久婷婷国产综合精品青草| 久久aⅴ乱码一区二区三区| 亚洲一区二区成人在线观看| 日韩一区二区精品视频| 99精品视频免费观看| 在线亚洲电影| 亚洲神马久久| 亚洲欧美日韩爽爽影院| 日韩网站在线观看| 亚洲小说欧美另类婷婷| 亚洲欧美视频在线观看视频| 欧美一区二区三区免费视| 久久99在线观看| av成人免费在线| 亚洲私人影院在线观看| 亚洲综合社区| 久久久国际精品| 欧美精品二区三区四区免费看视频| 久久精品99国产精品酒店日本| 久久视频在线视频| 亚洲欧洲一级| 久久精品观看| 欧美日韩岛国| 国产酒店精品激情| 亚洲日本激情| 激情久久影院| 亚洲一区免费观看| 亚洲欧美日本视频在线观看| 久久久精品网| 欧美精品一区在线播放| 国产精品爽爽爽| 亚洲国产免费| 性欧美暴力猛交69hd| 另类综合日韩欧美亚洲| 欧美日韩另类丝袜其他| 国产亚洲欧美色| 一本综合精品| 久久精品国产亚洲一区二区三区| 欧美精品不卡| 国产综合在线视频| 亚洲一区中文| 欧美大片在线看免费观看| 国产一区二区精品在线观看| 日韩视频在线你懂得| 亚洲卡通欧美制服中文| 久久天堂av综合合色| 日韩视频不卡| 国产亚洲欧美激情| 欧美日本国产在线| 久久久久国产精品午夜一区| 亚洲人被黑人高潮完整版| 国产精品日本| 欧美成人精品在线视频| 亚洲欧美成人一区二区在线电影 | 美女诱惑黄网站一区| 999亚洲国产精| 国产自产精品| 国产精品初高中精品久久| 裸体一区二区三区| 欧美一级久久久久久久大片| 亚洲精品韩国| 欲色影视综合吧| 国产日韩在线一区| 欧美视频中文一区二区三区在线观看| 性欧美video另类hd性玩具| 亚洲黄色在线看| 狠狠综合久久| 国产深夜精品| 国产精品日本一区二区| 欧美日韩高清在线| 欧美国产精品中文字幕| 久久精品视频免费| 亚洲一区二区三区四区五区午夜| 91久久国产综合久久蜜月精品 | 亚洲欧美资源在线| 亚洲人成网站影音先锋播放| 国产一二三精品| 国产精品私房写真福利视频| 欧美另类变人与禽xxxxx| 久久亚洲图片| 久久婷婷国产综合精品青草| 久久精品1区| 欧美在线视频在线播放完整版免费观看| 一区二区欧美日韩视频| 最新国产成人在线观看| 在线观看视频一区二区欧美日韩| 国产精品永久入口久久久| 国产精品久久久久91| 国产精品久久久久久av福利软件| 欧美紧缚bdsm在线视频| 欧美人成网站| 国产精品xxxxx| 欧美三级不卡| 国产精品美女| 国产精品资源在线观看| 国产精品丝袜久久久久久app | 篠田优中文在线播放第一区| 亚洲与欧洲av电影| 亚洲欧美日韩综合aⅴ视频| 亚洲色图在线视频| 一区二区欧美国产| 亚洲视频国产视频| 亚洲视频狠狠| 久久久高清一区二区三区| 欧美在线观看网址综合| 亚洲欧美国产va在线影院| 欧美在线观看视频| 久久超碰97中文字幕| 欧美一区二区三区四区在线观看| 亚洲午夜视频在线观看| 亚洲制服丝袜在线| 久久er99精品| 欧美成人精品影院| 欧美日韩网站| 国产精品igao视频网网址不卡日韩| 国产精品素人视频| 亚洲第一中文字幕| 亚洲网站视频| 久久中文久久字幕| 国产精品www| 最近中文字幕日韩精品| 亚洲永久在线| 欧美激情成人在线| 国产日韩欧美精品| 99天天综合性| 久久免费国产精品1| 欧美日韩专区| 亚洲国产精品一区二区尤物区 | 国产精品自拍小视频| 经典三级久久| 中文网丁香综合网| 可以看av的网站久久看| 欧美性淫爽ww久久久久无| 在线观看精品| 亚洲综合第一页| 欧美本精品男人aⅴ天堂| 国产欧美日韩在线观看| 亚洲视频www| 欧美成人免费在线视频| 国产婷婷精品| 亚洲影视在线| 欧美日韩综合| 日韩视频一区| 欧美xart系列在线观看| 国内精品视频在线观看| 亚洲在线国产日韩欧美| 欧美日韩成人综合| 91久久精品一区二区三区| 久久久久国色av免费观看性色| 国产精品成av人在线视午夜片 | 欧美精品一区在线播放| 在线观看日韩国产| 久久国产精品第一页| 国产日韩精品视频一区| 亚洲午夜精品久久久久久浪潮 | 亚洲精品一区二区三区不| 久久久精品久久久久| 国产性猛交xxxx免费看久久| 亚洲欧美在线免费| 国产精品视频大全| 亚洲欧美精品伊人久久| 国产精品国产三级国产aⅴ无密码| 亚洲乱码精品一二三四区日韩在线 | 亚洲人精品午夜在线观看| 久久精品盗摄| 国产精品成人一区| 99亚洲视频| 欧美日韩综合精品| 亚洲一区二区三区中文字幕在线| 欧美色图五月天| 在线一区二区三区做爰视频网站| 你懂的国产精品| 亚洲美女黄网| 国产精品av免费在线观看| 日韩亚洲欧美一区二区三区| 欧美美女视频| 亚洲永久在线观看| 国产亚洲日本欧美韩国| 久久资源在线| 一区二区欧美激情| 国产亚洲激情视频在线| 久久一区欧美| 亚洲视频中文| 国产有码一区二区|