事務
- innodb支持事務,在執行事務的時候會記錄事務日誌
事務的特性:
- 原子性:要麼都執行,要麼都不執行
- 一致性:保證數據業務上一致。數據庫的完整性沒有被破壞。表示寫入的資料必須完全符合所有的預設規則
- 持久性:一旦事務提交,對數據的修改是永久的
- 隔離性:不同事務間相互隔離,在併發情況下不會因爲交叉執行導致數據不一致
手動開啓:
- begin 或者 start transaction
- rollback
- commit
自動開啓
SET AUTOCOMMIT=0 禁止自動提交
SET AUTOCOMMIT=1 開啓自動提交
delete truncate drop
- | delete | truncate | drop |
---|---|---|---|
每次刪除條數 | 每次刪除一行 | 所有數據 | 所有數據 |
是否記錄事務 | 是(需要提交事務後才能生效,可以回滾) | 否(不能回滾) | 否(不能回滾) |
語句類型 | DML | DDL | DDL |
是否觸發觸發器 | 是 | 否 | 否 |
執行後空間大小 | 不會減少表或索引所佔用的空間 | 恢復到初始大小 | 表所佔用的空間全釋放掉 |
執行速度 | 慢 | 較快 | 快 |
執行對象 | table、view | table | table、view |
刪除內容 | 只刪除數據 | 只刪除數據(表結構及其列、約束、索引等保持不變) | 整個表(結構、數據、約束(constrain),觸發器(trigger)索引(index)) |
FOREIGN KEY 約束的表 | 支持 | 不支持 | ?? |
是否支持where | 支持 | 不支持 | 不支持 |
- truncate爲什麼比delete快:delete每次只刪除一行,每行記錄事務日誌,truncate釋放存儲表數據所用的數據頁來刪除數據,只在事務日誌中記錄頁的釋放
- delete會記錄事務日誌,同時也會記錄二進制日誌。drop和truncate只會記錄二進制日誌
- 二進制日誌也叫作變更日誌,主要用於記錄修改數據或有可能引起數據改變的mysql語句
日誌:http://www.mamicode.com/info-detail-2087669.html
delete、truncate、drop:https://www.cnblogs.com/zhizhao/p/7825469.html
預編譯
prepare prep from "select count(*) from test2";
prepare pre2 from "select * from test2 where a=?";
set @a="select * from test2";
prepare pre1 from @a;execute pre1;
prepare pre3 from "select * from test2 where a=? and b=?";
- 執行
execute prep;
set @a=10;execute pre2 using @a;
execute pre3 using @a,@b;
- 刪除
drop prepare pre3;