美文网首页
MySQL 中事务与引擎的基础概念

MySQL 中事务与引擎的基础概念

作者: djz0306 | 来源:发表于2019-07-15 21:23 被阅读0次

    在之前的文章中,建表语句后面通常都会带一个 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 ,机器以后吐钞以后带走,此时就无法撤销了。无法撤销只能再做一次“补偿性事务”

    相关文章

      网友评论

          本文标题:MySQL 中事务与引擎的基础概念

          本文链接:https://www.haomeiwen.com/subject/ksnokctx.html