直接進入正題,請看下面**
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...