事务
- 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;