事务(一)

事务

什么是事务

所谓事务,就是一系列操作,这些操作要么都执行,要么都不执行。

事务的特性

事务必须满足ACID四大特性,原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

  • 原子性:

  一个事务必须被看成一个不可分割的最小单元,整个事务中的一系列操作,要么都执行,要么都不执行。

  • 一致性:

  一致性是在原子性基础上的补充。
  数据库总是将数据从一个状态通过一系列操纵之后变成另一个状态。在一系列操纵失败的情况下必须保证数据没有发生变化,和原来的状态一致。

  • 隔离性:

  通常来说,一个事务所做的修改在最终提交之前,对其他事务是不可见的。但隔离有四个级别。

  • 持久性:

  一旦事务提交之后,该事务所做的修改就会永久的保存在数据库中。

事务的隔离级别

上面提及隔离性的时候谈到了事务的隔离级别。在实际应用中,事务分为四种隔离级别。

在介绍隔离级别之前,先举例介绍一下脏读、不可重复读和幻读。

  • 脏读

  当一个事务正在访问数据,并且对数据进行了修改,但是此时事务还没有提交。与此同时,另一个事务也访问了这个数据,这个时候就产生了脏数据。即为脏读。

  举个例子:
  现在有一张库存表,里面产品A有库存10个。现在仓库管理员铁柱和狗蛋两个人同时对产品A进行操作。
  1.铁柱网速比较快,先查到产品A有10个,又存入了10个产品A,但还没有提交。
  2.狗蛋网速比较慢,刚刚查到产品A,这个时候查到有20个产品A,并且准备取出20个。
  3.铁柱突然回滚了刚才的操作,使得产品A的库存又变回了10。
  这时,狗蛋读取的库存20就是脏数据。

  • 不可重复读

  多次读取,数据不一致。一个事务,多次读取同一个数据时,另一个事务访问并修改了该数据。恰好放生在第一个事务两次读取该数据之前,那么这两次读取到的数据就可能不一样,因此为不可重复读。

  举个例子:
  还是有一张库存表,里面产品A有库存10个。现在仓库管理员铁柱和狗蛋两个人同时对产品A进行操作。
  1.铁柱先查询产品A,此时库存为10,但是铁柱有点眼花,需要再查询一遍
  2.在铁柱第二遍查询之前,刚好狗蛋给产品A添加了10个库存。
  3.在狗蛋添加库存之后,铁柱刚好查完第二遍,发现库存变成了20,开始怀疑自己老眼昏花了。
  这时,就产生了铁柱在查询库存两次读取不一致的问题,即为不可重复读。

  • 幻读

  一个事务对表全部行的数据进行了修改(比如添加了一行数据),这时,另一个事务也对表全部行的数据进行了修改(比如删除了一行数据)。这就造成了表没有被修改的假象。即为幻读。

  举个例子:
  还是有一张库存表,现在库存表里有10个不同的产品。仓库管理员铁柱和狗蛋两个人需要对产品进行整理并统计。
  1.铁柱需要添加新的产品B,在添加之前先查询了一下数据库,确认表里没有产品B,但此时铁柱还没有开始添加。
  2.狗蛋也接到任务要添加产品B,但狗蛋没有铁柱做事心细直接添加了产品B,并提交了事务。
  3.铁柱做事认真,又查了一遍,确认自己没有添加产品B后,开始添加产品B,结果数据库报错说已经存在了产品B。

1. READ UNCOMMITTED(未提交读)

  在未提交读的隔离级别中,一个事务对数据进行了修改,即使没有提交,其他事务也会获得修改后的数据。
  未提交读会存在脏读、不可重复读、幻读的可能性。

2. READ COMMITTED(提交读)

  在提交读的隔离级别中,一个事务对数据进行了修改,只有提交后其他事务才会获得修改后的数据。
  提交读会存在不可重复读、幻读的可能性。

3. REPEATABLE READ(可重复读)

  在可重复读的隔离级别中,一个事务中的多次查询结果都是一致的,不受其他事务的影响。
  可重复读存在幻读的可能性 (但MySQL的InnoDB引擎的RR隔离级别其实并不会出现幻读。)

4. SERIALIZABLE(序列化)

  隔离的最好级别,它通过强制事务串行执行,避免了所谓的幻读,但是由于读取每一行数据时都进行了加锁操作,性能大大降低。

练习题

现在库存表里有iPhone 100部。

事务A:1) 开启事务 2) 扣除10部iPhone 3) 提交事务

事务B:4) 开启事务 5) 查询iPhone库存 6) 查询iPhone库存 7) 提交事务 8)查询iPhone库存

当执行顺序为 14526378 时,事务B在READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 隔离级别下三次查询的结果分为是多少?

时间: 2024-11-08 23:07:59

事务(一)的相关文章

Spring事务管理(详解+实例)

写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: Spring事务机制详解 Spring事务配置的五种方式 Spring中的事务管理实例详解 1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是要么都执行要么都

MySQL的事务与事务隔离

MySQL中自从引入InnoDB引擎后,在MySQL中就支持事务,事务就是一组原子性的查询语句,也即将多个查询当作一个独立的工作单元,平时通过提交工作单元来完成在事务中的相应的查询或修改,在能支持事务的数据库中必须要满足ACID测试,即事务的四个特性: A:Atomicity,原子性(都执行或者都不执行) C:Consistency,一致性(从一个一致性状态转到另外一个一致性状态) I:Isolaction,隔离性(一个事务的所有修改操作在提交前对其他事务时不可见的) D: Durability

(十五)PL/SQL事务

数据库事务是一个工作的原子单元,其可以由一个或多个相关的SQL语句组成.所谓的原子性就是数据库的修改所带来的构成事务的SQL语句可以集体被提交,即永久到数据库或从数据库中(撤消)回滚.一个成功执行的SQL语句和提交的事务不一样.即使一个SQL语句执行成功,除非包含该语句的事务被提交,但也可以回滚和声明(S)的所有更改可以撤消. 一.开始事务事务都有开始和结束.事务开始时有下列事件之一:  连接到数据库后执行的第一个SQL语句.  在事务完成之后发出每一个新的SQL语句完成. 二.提交事务事务是通

spring事务没回滚

最近遇见一个问题,用spring管理实务,在service层处理数据,保存数据时出现异常,但没有回滚,检查了一下,发现是因为我用try catch将异常进行捕获了,没有抛出导致的:默认spring事务只在发生未被捕获的 runtimeexcetpion时才回滚. 处理发法一:捕获异常后,新生成runtimeexcetpion: try { userDao.save(user); userDao.update(user); } catch (Exception e) { logger.info("

回滚的意义---JDBC事务回滚探究

JDBC手动事务提交回滚的常见写法一直是rollback写在commit的catch之后: try{ conn.setAutoCommit(false); ps.executeUpdate(); ps.executeUpdate(); conn.commit(); }catch(Exception e){ conn.rollback(); } 但是,这种回滚是没有意义的: 一旦commit前出错, 就不提交了, 回滚无用 一旦commit了, 说明没错, 不用回滚 找到一篇和我观点相同的文章:

我的学习之路_第二十二章_事务

JDBC事务 [事务] 作用: 保证多条SQL语句,要么都执行成功,要么都执行失败. mysql数据库,执行SQL语句,自动开启事务,提交事务,回滚事务,把数据永久保存 oracle数据库,执行SQL语句,手动开始会务,提交事务,回滚事务,把数据永久保存. Connection接口中和事务有关的方法: 无返回值 setAutoCommit(boolean autoCommit) 将此连接的自动提交模式设置为给定状态. 参数:autoCommit : true表示自动提交模式, false表示禁用

SQL事务的四种隔离级别

1未提交读(Read uncommitted):完成不锁表,所以会出现脏数据.2提交读(Read committed):1.事务1中update才锁表,可以select到最新数据. 事务2select查不到数据. 会一直等.加上WITH (NOLOCK)就可以读了. 2.select是不锁表,所以其他事务可以修改数据.当有两个select时, 第二个select会出现脏数据.不可重复读. 3可重复读(Repeatable read): 解决提交读不可重复读的问题的,两次查询到的结果一致. 这只能

数据库事务

事务的四个特性 (ACID) ,分别是原子性( Atomicity), 一致性( Consistency), 隔离性( Isolation), 持久性( Durability).一致性是事务的目的,原子性,隔离性,持久性是一致性的必要条件. 隔离性:多个并发事务之间要相互隔离,对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行. 隔离级别有四种: 1.Serializable :最严格的级别,

Redis系列六 Redis事务

Redis事务 1.介绍 在Redis事务中可以一次执行多个命令,本质是一组命令的集合.一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞. 2.事务的作用 一个队列中,一次性.顺序性.排他性的执行一系列命令. 3.事物执行五中情况 case1:正常执行 执行exec全部成功 Case2:放弃事务 执行Discard Case3:全体连坐 在向事物队列中添加命令的时候报错,然后执行Exec会全部失败. Case4:冤头债主 在向事物队列中添加命令的时候没有报错,但在

数据库事务的四大特性和事务隔离级别

Reference: [1] http://www.cnblogs.com/fjdingsd/p/5273008.html [2] http://blog.csdn.net/fg2006/article/details/6937413 数据库事务四大特性 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全