先貼乙個看雲手冊,關於事務:
使用事務處理的話,需要資料庫引擎支援事務處理。比如 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...