在之前的文章中,建表语句后面通常都会带一个 engine myisam
,从字面上来看就是将引擎设为 myisam。在 MySQL 中有几种不同的引擎,他们的作用特点各有不同。首先来看引擎的概念。
假设有一份 MySQL 笔记需要保存起来可以记在脑子里,也可以铅笔记在纸上,用原子笔记在纸上,还可以刻在石头上。在这个过程中,不变的是数据,都是笔记,变化的是存储的方式。engine 引擎也是类似的情况。engine 引擎可以理解成 MySQL 存储数据的不同方式。具体内容如下:
特点 | Myisam | InnoDB | BDB | Memory | Archive |
---|---|---|---|---|---|
批量插入的速度 | 高 | 低 | 高 | 高 | 非常高 |
事务安全 | 支持 | 支持 | |||
全文索引 | 支持 | ||||
锁机制 | 表锁 | 行锁 | 页锁 | 表锁 | 行锁 |
存储限制 | 没有 | 64T | 没有 | 有 | 没有 |
B树索引 | 支持 | 支持 | 支持 | 支持 | |
哈希索引 | 支持 | 支持 | |||
集群索引 | 支持 | ||||
数据缓存 | 支持 | 支持 | |||
索引缓存 | 支持 | 支持 | 支持 | ||
数据可压缩 | 支持 | 支持 | |||
空间使用 | 低 | 高 | 低 | N/A | 非常低 |
内存使用 | 低 | 高 | 低 | 中等 | 低 |
外键支持 | 支持 |
引擎的详细内容,在后面的文章中再详细学习。
事务
事务有四个属性,原子性,一致性,隔离性,持久性。以支持事务安全的 InnoDB 为例,建一张表:
create table test01(uname varchar(20),money int)engine innodb charset utf8;
插入一条数据:
insert into test01 values ('zhangsan',5000),('lisi',2000);
开启事务:
start transaction;
原子性
场景一:在购物网站抢购时,商品只剩下一件,A 和 B 两人同时看到了商品,几乎同时提交购买
场景二:在银行转账时,A 给 B 转账 100 元,那么 A 账号减少 100,B 账号增加 100,转账才能算完成
像上面这种,需要 2 步或者 N 步操作,从逻辑上讲,称之为:“原子操作”。逻辑上不可分割操作要么全部成功,要么全部失败,这就是事务的原子性。
将上表中李四的钱转 1000 给张三。
update test01 set money = money + 1000 where uname="zhangsan";
update test01 set money = money - 1000 where uname="lisi";
使用 commit 来提交:
commit;
提交以后张三的钱就变成了 4000,李四的就变成了 1000。提交以后再次需要再次开启事务:
start transaction;
这次李四再给张三转 500:
update test01 set money = money + 500 where uname="zhangsan";
但是在扣除李四的钱的时候,网络出现了问题,扣除失败了,以语句错误来模拟:
update test02 set money = money + 500 where uname="lisi";
在这种部分操作失败的情况下,就会回滚之前的操作:
rollback;
此时张三的钱还是 4000 并非 4500,而李四的还是 1000
一致性
一致性是指操作前后,值的变化,逻辑上成立。例如张三的减了 500 而李四的加了 300 这样是不行的。假设加了300 以后溢出来,这样也是失败
隔离性
隔离性是指,事务结束前,每一步操作带来的影响,别人看不见。例如李四给张三转 1000 ,张三打开账户等着。在李四刚刚减少 1000 的时候,张三增加 1000 以后,张三立马转走账户里的所有钱。此时若是李四点击了取消转账。
开启事务
start transaction;
张三的钱增加:
update test01 set money = money + 500 where uname="zhangsan";
若此时在另一个地方查询此时张三和李四的钱,会发现他俩的钱都没有变,还是 4000 和 1000 。此时李四也减少 500
update test01 set money = money - 500 where uname="lisi";
若此时在另一个地方查询此时张三和李四的钱,会发现他俩的钱还都没有变,还是 4000 和 1000 。
此时再提交:
commit;
若此时在另一个地方查询此时张三和李四的钱,会发现他俩的钱变成 4500 和 500 了。
持久性
持久性是指,事务一旦完成,无法撤销。例如 ATM 机器取钱,取 500 ,机器以后吐钞以后带走,此时就无法撤销了。无法撤销只能再做一次“补偿性事务”
网友评论