laravel Model 執行事務

2021-07-30 23:11:35 字數 1378 閱讀 6772

1.官方手冊是這樣介紹的:

想要在乙個資料庫事務中執行一連串操作,可以使用db門面的transaction方法,如果事務閉包中丟擲異常,事務將會自動回滾。如果閉包執行成功,事務將會自動提交。使用transaction方法時不需要擔心手動回滾或提交:

db::transaction(function () );
手動使用事務

如果你想要手動開始事務從而對回滾和提交有乙個完整的控制,可以使用db門面的begintransaction方法:

db::begintransaction();
你可以通過rollback方法回滾事務:

db::rollback();
最後,你可以通過commit方法提交事務:

db::commit();
注意:使用db門面的事務方法還可以用於控制查詢構建器和 eloquent orm 的事務。

2.具體是這樣使用的:

use illuminate\support\facades\db;

public function callrevert(request $request)elsecatch (\exception $e)

}}

注意事務回滾之後會有自增id 不會連續 比如 3,4,5, 在5回滾之後 再次插入資料會變成 3,4,6 會跳過 為什麼呢?

如果你認為自增id不應該被事務化,那麼其他事務不得不等待著,檢查自增id是被使用還是被回滾,這就導致阻塞

因為innodb的auto_increament的計數器記錄的當前值是儲存在存內 存中的,並不是存在於磁碟上,當mysql

server處於執行的時候,這個計數值只會隨著insert改增長,不會隨著delete而減少。而當mysql

server啟動時,當我們需要去查詢auto_increment計數值時,mysql便會自動執行:select max(id) from 表名

for update;語句來獲得當前auto_increment列的最大值,然後將這個值放到auto_increment計數器中。所以就算

rollback mysql的auto_increament計數器也不會作負運算

解決辦法:可以使用count()  等計數 方式 插入id  (比較麻煩)

setTimeout 延遲執行事件無法執行

今天在看紅寶書的時候突然看到settimeout 部分,想起來之前做東西時候遇到的乙個問題!當時為了單擊和雙擊不衝突,所以給mousedown加了settimeout延遲執行。後面又要區分滑鼠移動和沒移動又加了乙個settimeout,就遇到問題了。程式會先執行mousedown中的延遲,mouse...

mysql 自動執行事件 mysql 自動執行事件

顯示定時任務 show events 檢視是否開啟定時器 show variables like event scheduler 開啟定時器 需管理員使用者 set global event scheduler on 建立事件,每年12 31日00 00 00執行 drop event if exi...

BLToolkit 關於執行事務的

我需要在一次事務中同時往同乙個表插入多條資料,string sql insert into consoleresult transid type values transid type idbdataparameter cmdparams new idbdataparameter 我需要把三個這樣的...