ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

数据库:事务

2020-02-03 21:03:15  阅读:227  来源: 互联网

标签:回滚 读取 数据库 事务 PROPAGATION 提交


1. 什么是事务?

事务是对数据库中一系列操作进行统一回滚或者提交的操作,主要用来保证数据的完整性和一致性。

2. 事务四大特性(ACID)原子性、一致性、隔离性、持久性?

2.1 原子性(Atomicity):
  原子性是指事物包含的所有操作要么全部成功,要么全部失败回滚,因此事物的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

2.2 一致性(Consisitency):
  事物开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱,B却没收到。

2.3 隔离性(Isolation):
  隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他的事物所干扰,多个并发事务之间要相互隔离。同一时间,只允许一个事务请求同一数据,不同事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。

2.4 持久性(Durability):
  持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

3. 事务的并发?

3.1 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据就是脏数据。
3.2 不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,读取到的数据结果会不一致。
3.3 幻读:幻读解决了不可重复读,保证了同一事务里,查询的结果都是事务开始时的状态。

4. 事务的隔离级别?

4.1 读取未提交内容(Read Uncommitted)一个事务可以读到另一个事务未提交的结果。所有的并发事务问题都会发生。
4.2 读取提交内容(Read Committed)只有在事务提交后,其更新结果才会被其他事务看见。可以解决脏读问题。
4.3 可重复读取(Repeated Read)在同一个事务中,对于同一份数据的读取结果总是事务开始时时间点的状态。可以解决脏读、不可重复读,但是会有幻读现象。
4.4 可串行化(Serialization)最高隔离级别,牺牲了系统的并发性,可以解决并发事务的所有问题。

5. 事务传播行为?

1. PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
2. PROPAGATION_SUPPORTS:如果当前存在事务,就加入该事务,如果当前没有事务,就以非事务运行。
3. PROPAGATION_MANDATORY:如果当前存在事务,就加入该事务,如果当前没有事务,就抛出异常。
4. PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
5. PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
6. PROPAGATION_NEVER:以非事务方式执行操作,如果当前存在事务,则抛出异常。
7. PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则创建一个新事务。

6. 嵌套事务?

  嵌套是子事务套在父事务中执行,子事务是父事务的一部分,在进入子事务之前,父事务建立一个回滚点,叫save point,然后执行子事务。这个子事务的执行也是父事务的一部分,子事务执行结束,父事务继续执行。

6.1 如果子事务回滚,会发生什么?
父事务会回滚到进入子事务前建立的save point,然后尝试其他的事务或者其他的业务逻辑,父事务之前的操作不会受到影响,更不会自动回滚。

6.2 如果父事务回滚,会发生什么?
父事务回滚,子事务也会跟着回滚。因为父事务结束之前,子事务是不会提交的,我们说子事务是父事务的一部分,正是这个道理。

6.3 事务的提交是什么情况?
子事务先提交,父事务再提交。还是那句话,子事务是父事务的一部分,由父事务统一提交。

标签:回滚,读取,数据库,事务,PROPAGATION,提交
来源: https://www.cnblogs.com/xiaobaizzz/p/12257309.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有