• 事务----四大特性


    事务:

    据说是面试中容易被考的一个概念。有时需要结合例子去向面试官说清楚自己对事务的四大特性的理解。

    事务的四大特性  ACID:

    1.原子性 atomicity

    2.一致性 consistency

    3.隔离性 isolation

    4.持久性 durability

    原子性:

    这个针对于  一个事务 而言。一个事务中可能包含很多的  “操作” 。

    这些  “操作”  产生的结果 有2种  :要么 全部执行成功,要么 全部执行失败。 不存在一部分成功 一部分失败的情况。

    一致性:

    针对于一个事务中。

    一个事务 执行的结果  必须是使  数据库  从一个 一致性状态  变到另一个一致性状态。

    什么是“一致性状态”?

    当数据库只包含  成功事务  提交的结果时,就说数据库 处于一致性状态。

    还是拿  A,B两个人转账的陈年例子来说明:

    一开始 A和B分别有1000元,他俩的钱的和为2000元。

    事务开始了:

    A:  原本1000元                转账成功的话:   剩1000-200=800元                转账失败的话:    A还是1000元

      原本总共2000元    成功的话,A+B依然=2000元        失败的话,A+B也依然=2000元

    B:  原本1000元    转账成功的话:剩1000+200=1200元     转账失败的话:   B也还是1000元

    隔离性:

    针对于   事务 与  事务 之间。

    还有一个大前提:  隔离级别足够高  

    在并发操作中(即很多事务同时进行着),不同事务之间是不会相互干扰到的。

    eg:事务A  去访问数据库,它看到的数据库中的资源  要么是被其他事务  增删改 之前的样子;

    要么是已经被其他事务  增删改  之后的样子。

    别的事务的增删改的过程   事务A是看不到的。

    持久性:

    持久性,指的是  持久保存数据。

    如果把数据存在内存中,这不叫持久保存数据,因为当浏览器/服务器关闭了,内存就释放了,内存中的数据也就没了。

    但当数据库 存数据时,把数据以文件的形式 存放在硬盘上,那么就实现了数据的持久保存。

    eg:

    开启事务:A给B转账200元。

    A  原有 1000元          给B转200:   1000-200=800  (如果最后成功commit了,数据库中记录这个过程的日志 就会 记录下来  :成功后  我就把 A 的钱更新为800元    )

    B 原有 1000元           接收到200 :  1000+200=1200  (如果最后成功commit了,数据库中记录这个过程的日志 就会 记录下来: 成功后  我就把 B的钱更新为1200元   )

    结束事务:回滚(会把日志删除)/成功提交(会修改日志中的内功)

    额外的:

    开启事务:start transaction

    结束事务:commit (提交事务)

         rollback (回滚事务)--可理解为 操作们被 撤回了。

    再额外的:

    事务并发读时 会存在的问题:

    脏读:当一个数据库的隔离级别设置为最低时,可能会发生。

    eg:A开启事务,给B转100元,但没commit。这时B开启事务,查到钱多了100元。

               如果 A 使坏,rollback了这100元。  那么B 查钱时 查到的就是  “脏数据”!

    脏读  结果很严重   ,作为一个数据库  一定要避免  脏读。

    不可重复度:  在一个事务A中,对同一记录的两次读取结果不一致,因为在两次查询的间隙时间,另一个事务B 对数据库中的记录  做了修改 (针对修改操作)。

    eg:

    事务A:开启事务---

        第一次读取账户W的金额:1000

      (此时:另一头的事务B  开启了----从账户W中取走100元,账户W中剩900元,并且commit)

        第二次又查了一次账户W的金额:900了

    幻读(虚读):在一个事务A中,对同一张表的两次查询结果  不一致,因为在两次查询的间隙时间,另一个事务B 对这个表中,插入/删除了 记录  (针对 插入/删除)。

    eg:

    事务A:开启事务

      第一次 看一个学生名单时 是: 喜羊羊,美羊羊,懒羊羊

      (此时:另一头的事务B  开启了事务,往这个学生名单中 插入了一个  灰太狼  ,并且commit了 )

      第二次  再看这个学生名单时  变成了:喜羊羊,美羊羊,懒羊羊, 灰太狼。---仿佛出现了幻觉~~

    事务的隔离级别:

    1.READ UNCOMMITTED (读  未提交的数据)

    安全性最差,但性能最好 (不使用!!!)

    2.READ COMMITTED (读  已提交的数据)

    安全性较差,性能较好  (Oracle 数据库 默认是这种)

    3.REPEATABLE READ (可重复读)

    安全性较高,性能较差   (MySQL 数据库 默认是这种)

    4.SERIALIZABLE (串行化)

    安全性最高,性能最差。(不使用!)(eg:去大食堂吃饭,需要A吃完 从食堂出来,B才能进去吃饭)

    拓展:

    MySQL查询当前事务的隔离级别:

    select @@tx_isolation;
  • 相关阅读:
    idea执行报错NoClassDefFoundError
    git合并几个commit
    jenkins+allure+持续构建+一些配置和遇到的问题
    接口框架坑记录
    jvm-sandbox对运行中的java执行文件做插桩,故障注入
    linux 安装nogui-chrome,构造selenium运行环境
    python之pychram激活码
    python之闭包、装饰器、生成器、反射
    python之 Requests入门到实践
    Python使用xlwt模块 操作Excel文件(转载)
  • 原文地址:https://www.cnblogs.com/raphaelJava-4560/p/13155001.html
Copyright © 2020-2023  润新知