ThinkPHP5 mysql資料庫不發生回滾

2021-10-05 22:37:26 字數 2053 閱讀 4665

先貼乙個看雲手冊,關於事務:

使用事務處理的話,需要資料庫引擎支援事務處理。比如 mysql 的 myisam 不支援事務處理,需要使用 innodb 引擎

我在thinkphp5.0.22版本中,在運算元據庫前開啟了手動事務處理:

//  開始多表插入事務處理

db::starttrans();

$banner_data = ['banner_id' => 1,'goods_id' => $goodsid,'create_time' => date('y-m-d h:i:s')];

db::name('banner')->insertgetid(['goods_id' => $goodsid,'create_time' => date('y-m-d h:i:s')]);

$banner = db::name('banner')->insertgetid($banner_data);

if(!$banner) else

我使用了兩次insertgetid(),執行完畢會返回插入記錄的主鍵,第一次使用insertgetid()時並沒有指定主鍵值,主鍵會自增插入。第二次使用insertgetid()時,我指定了主鍵banner_id = 1。該主鍵在資料庫banner表中已經存在。不出意外的話會發生回滾,banner表不會有任何資料插入。

banner表,**執行前:

banner表,**執行後:

不應該被提交的第一次插入執行了!!!文件中提到mysql需要innodb引擎支援,檢查一波資料庫引擎:

執行mysql命令:show engines;

再檢查表所用的引擎:

執行msql命令: show create table 表名;

show create table banner;

也可以使用:

show table status;(不過要注意使用時是否正在使用目標資料庫,否則記得在後面加上from 資料庫名)

發現banner表並沒有用innodb引擎,盲猜把它改用innodb引擎就好了?我的資料庫中沒什麼資料,就直接簡單粗暴的直接該更改引擎型別了。雖然更改完後該錶資料還在,但是更改的時候會引發大量io操作,應該是表中有多少條資料就會有多少次io操作,其他資料庫有大量資料的請謹慎操作!!!

alter table banner engine = innodb;  

更改完畢記得重啟資料庫,然後我把banner表恢復到只有一條記錄的時候:

再次執行**:

生效了,nice!!! 如果想拋出自定義異常的話,就使用try{}catch{}:

//  開始多表插入事務處理

db::starttrans();

try catch (\exception $e)

thinkphp5 讀取mysql中文資料亂碼

thinkphp5 讀取mysql中文資料亂碼 tp5預設的pdo連線mysql方式在某種特殊環境下沒有預設utf8 寫在資料庫datebse.php配置裡增加連線配置資訊 params pdo mysql attr init command set names utf8 pdo mysql att...

thinkphp5實現mysql資料庫備份

其實備份資料庫說白了就是向乙個.sql的文件中寫入一條一條的sql命令 public function back echo 正在備份,請耐心等待.info r n info 日期 date y m d h i s time r n info 僅用於測試和學習,本程式不適合處理超大量資料 r n in...

ThinkPHP5使用快取

cache 使用復合快取型別 type complex 預設使用的快取 default 驅動方式 type file 在這設定換人的快取方式 快取儲存目錄 path cache path,檔案快取 file 驅動方式 type file 設定不同的快取儲存目錄 path runtime path f...