zoukankan      html  css  js  c++  java
  • 谈一谈 对 事务 的理解

    1.事务与四大特性

      面试老是谈到事务,事务的实现其实很简单,但是对事务的描述,不同的人有不同的看法,描述 语言更是千变万化,

    这种概念性的东西,经验告诉我,不能死记硬背,应该用自己的话来理解才是上上签。

      那么,什么是事务?

      想要理解什么是事务,应该先从事务的4大特性入手。

      分别是:原子性、一致性、隔离性、持久性。英文缩写是 ACID

      什么是原子性?

      原子性就是要么全部执行成功,要么全部都不执行。
      如何理解?就像前面有个水坑,要么一脚向前跨过去,要么就索性不过去。

      什么是一致性?

      事务执行的结果,必须是数据库从一个一致性状态变到另一个一致性状态。
      如何理解?我银行账户有200块钱,小明银行账户为零,现在是一致性状态,如果我把200块钱一次性
    转到小明账户后,我的账户为 -200,小明的账户为 +200 ,最终我的账户为0,小明的账户为200,
    总额不变 ,也就是变到了另一个一致性,不会出现我的账户-200后小明的账户没有+200的情况,否则就不是一致性了。

      什么是隔离性?

      并发操作同一个表时,数据库会开启多个事务,事务之间相互隔离,互不影响。
      怎么理解?假设有两个事务,分别是事务1和事务2 ,那么两个事务不能相互影响 ,也就是说,要么事务1在开始之前,事务2已经结束了,
    要么事务1在结束之前事务2还没开始,就像加锁操作,只有事务获得锁权限才能对表进行操作,否则需要等待。
    不然造成脏读、幻读、不可重复读。【待会解释这3个区别】

      什么是持久性?

      当事务确认完成后,对数据的改变是永久性的。
      怎么理解?对表做曾删改操作,并提交事务后,曾删改操作的结果将存在表中,只要不被其他事务做曾删改操作,那么改变后的表数据将用于保持不变。

       又回到老话题,什么是事务?

      根据事务的四大特性可知,事务就是一组严密的逻辑操作,所有操作必须全部执行成功,否则将会撤销所有操作,也就是事务回滚操作。

      怎么理解?

     在一个事务中,执行一组sql操作,如果所有操作都没抛出异常,则commit提交事务,如果抛出了异常,这会执行rollback回滚操作,
    也就是新增的数据删除 ,修改的数据则修改回去,删除的则新增回来。

     2.事务的并发问题

      什么是脏读?

    事务1读取了事务2更新后但还没提交的数据,事务2做回滚操作,那么事务1读取的数据就是脏数据,这样的操作就是脏读。
    简单来说,脏读就是读取了另一个事务的未提交数据。

      什么是不可重复读

    事务1多次读取同一个数据,在事务1读取数据的过程中,事务2对该数据进行了更新并提交事务,
    导致事务1多次读取同一数据的结果不一致,这就是不可重复读。
    简单来说,不可重复读就是多次读取同一数据的结果不一致,该数据被另一个事务更新并提交了

      什么是幻读?

    事务1 两次查询数据,第二次查询的结果要么比第一次的结果少了数据、要么比第一次的结果多了数据,因为在两次查询之间,被事务2添加或删除了数据,像出现幻觉一样。
    简单来说,幻读就是多次查询结果不一致,后查询的结果比之前查询的结果增加或减少了数据。

    3.事务隔离级别

    【隔离级别从低到高】

    (1)读未提交

    读未提交,顾名思义,就是一个事务可以读另一个事务未提交的数据,安全性最低的隔离级别,不可避免脏读数据、不可重复读、幻读。

    (2)读提交

    读提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据,为了解决脏读才设立的隔离级别,但是不可避免不可重复读、幻读。

    (3)可重复度

    可重复度,就是在开始读取数据时,不再允许修改操作,为了解决不可重复读而设立,但是不可避免幻读。

    (4)序列化

    序列化,最高的事务隔离级别,事务串行化顺序执行,可以避免脏读、不可重复读、幻读,
    但是效率低下,消耗数据库性能,一般不使用。
  • 相关阅读:
    PHP抓取页面的几种方式
    MySQL性能优化的最佳20+条经验
    linux下导入、导出mysql数据库命令
    8个必备的PHP功能开发
    jquery中的children()和contents()的区别
    centos 通用开发工具及库安装 有了它不用愁了
    将bat批处理文件注册成windows服务
    squid隐藏squid的版本号
    squid如何屏蔽User-Agent为空的请求
    RHEL/CentOS 6.x使用EPEL6与remi的yum源安装MySQL 5.5.x
  • 原文地址:https://www.cnblogs.com/c2g5201314/p/13163954.html
Copyright © 2011-2022 走看看