關於tp5是否支援事務巢狀的探索之旅

2021-10-10 16:41:55 字數 1164 閱讀 2741

直接進入正題,請看下面**

db::starttrans();

try else

db::commit()

; } catch (\exception $ee)

}db::commit()

;} catch (\exception $e)

echo '---測試結束---'

;die;

執行結果是:即使4和5commit了,但是整體是什麼都沒改變

結論:最外層的事務回滾了,那裡層的commit是不生效的,通過tp5的源**不難發現,只有當$this->transtimes為1的時候,才會真正的提交

以上**稍微改動一下,

echo '二級異常:'

.$ee-

>getmessage();

throw new \exception(

'一級異常:'

.$ee-

>getmessage())

;

改為:

echo '二級異常:'

.$ee-

>getmessage(

);

執行結果為:4和5都生效了,6丟擲了二級異常

最終結論:通過對比不難發現,只有最外層的commit時,才會真正的commit提交,因為那時的thi

s−>tr

anst

imes

為1,同

理可得,

只有this->transtimes為1,同理可得,只有

this

−>tr

anst

imes

為1,同

理可得,

只有this->transtimes為1的時候,才會真正的rollback回滾,其他情況都是在做$this->transtimes的「減一」操作。

tp5 事務處理

tp5 事務處理我理解的就是當兩個資料庫,或者連續操作關係很密切,你操作a會影響操作b時就需要手動事物處理。如果操作a成功操作b發生錯誤,如果不進行事物處理的話,雖然操作b會報錯,但是操作a是成功的,使用事物處理就會返回到操作前,舉個例子 我有100元,現在需求是要轉賬給你50,那麼簡單來說就需要兩...

TP5之事務回滾

熟悉mysql的應該都知道mysql innodb的事務及其他的四大特性,永續性,隔離性,原子性,一致性。原子性 在執行一組有特定邏輯的sql指令時,要麼全部執行成功,要麼全部不執行。只要其中乙個指令執行失敗,所有的指令都執行失敗,資料進行回滾,回到執行指令前的資料狀態。事務的原子性在很多場景都需要...

TP5事務操作簡明例項

如果乙個操作會改變資料庫多處資訊,並且這些資訊是密切相關的,為了確保每一處改動都是成功的,如果其中一處改動不成功,就將其它改動撤銷,以保證資料 事務 的完整性。比如 你給我轉賬10000塊,需要把你的餘額減10000,我的加10000,如果萬一我的餘額寫入失敗,那麼理應你的餘額不變,不然這10000...