简要:事务

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36324685/article/details/84340072

事务基础知识:

  1. 事务的特性

  2. 隔离级别:

  3. 传播行为

事务的特性 ACID :

A(Atomicity) 原子性:

保持本次事务中,所有操作都成功,只要有一个不成功,所有操作都不成功。

D(Durability)持久性:

执行完,刷进数据库,永久有效

I(Isolation) 隔离性:

隔离性,需要根据具体的隔离级别而定,区分于两个事务中,进行操作的个体,下面隔离级别会详细介绍。

C(Consistency)一致性:
保持执行前后的数据保持一致,比如张三,开始有600 ,李四,有700,经历过一次事务过后,保持总钱数还是1300

下面的图片来源:http://tech.it168.com/a2016/0905/2900/000002900122.shtml
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

隔离级别:

会萦绕三个问题来诉说:

  1. 不同的隔离级别会造成什么后果?
  2. 不同的隔离级别的优缺点?
  3. 介绍 oracle mysql 的默认隔离级别

1:不同的隔离级别会造成什么后果?

1.脏读  -- 读到未提交事务中的保存数据,比如保存了一条数据为,李四,1000,但是此事务并没有成功。
2.不可重复读 -- 两次读到的结果不一致,比如,1.刘备出军曹操,发出了一条告示,有请诸葛亮,跟随。
这时候,刘备发现粮草不足,然后更新了一条告示给这个告示栏,说,休整三日,择日再战,结果,有人告诉诸葛亮,说刘备请你    跟随....
3.幻读 -- 读到未提交的事务中的更新,比如张三,600 ,修改金额为800,但此事务回滚了,张三的钱不是800,还是原来的600.

2. 不同的隔离级别的优缺点?

1.隔离级别的种类及规避的问题
    1.READ_COMMIT     读已提交事务,规避了幻读和脏读,会造成不可重复读。
    2.READ_UNCOMMITTED 读未提交事务   会造成幻读,脏读,不可重复读
    3.REPEAT_READ  可重复读  规避不可重复读和幻读,但是可能会造成脏读。
    4.SERIALIZABLE  不并发,按序执行事务,很安全,但也绝对耗费性能,造成安全事务,规避 不可重复读,脏读,幻读

打个比方:还以刘备攻打曹操为例诉说他们的不同:
.请诸葛亮的例子

1.读已提交事务
如果是读已提交事务,就是告示贴出来,有眼尖的就立刻去告诉诸葛亮了,但腿脚慢,下个告示也出来了,结果要通知第两个告示的和腿脚慢的一块到了。
2.读未提交事务
就是告示刚写出来,还没贴到告示栏,听着这信了,就去通知诸葛亮了。
3.可重复读
就是告示贴出来了,腿脚快,告诉诸葛亮了,诸葛亮立刻就动身去见刘备了
4.序列化
刘备亲自去找的诸葛亮。

3.介绍 oracle mysql 的默认隔离级别
mysql : 可重复读
oracle: 读已提交事务

sping 事务传播行为:是区分两个事务的提交,回滚,处理方式的:

==========此处引用:https://blog.csdn.net/seaside_cse/article/details/80072138 ======================

Spring事务的传播行为定义了外层方法[注1]调用带有@Transactional的当前方法时,事务如何进行传播的规则,共有7种类型:
(1)PROPAGATION.REQUIRED(默认)
如果外层方法有事务,则当前方法加入外层事务;如果外层方法没有事务,则当前方法新建一个事务。
(2)PROPAGATION.REQUIRES_NEW
当前方法总是开启一个新的事务,如果外层方法有事务,则将外层事务挂起,先执行当前方法的事务(外层事务和当前方法的事务是两个不同的事务)。
当当前方法发生回滚并抛出RuntimeException时,如果该异常被捕获,则外层方法的事务不会因此回滚;如果该异常没有被捕获,则外层方法的事务就会因此而回滚。
当外层方法发生回滚时,如果其回滚发生在当前方法前,则当前方法得不到执行;如果其回滚发生在当前方法之后,则当前方法不会因此而回滚。
(3)PROPAGATION.NESTED
如果外层方法没事务,则当前方法新建一个事务;如果外层方法有事务,则把当前方法当成外层事务的一部分(使用savepoint实现),外层方法事务的rolback或者commit都会影响当前方法[注2],而当前方法的rolback不会导致外层事务回滚,除非rollback过程抛出了RuntimeException且该异常没有被捕获。
(4)PROPAGATION.SUPPORTS
如果外层方法没事务,那当前方法就按普通方法执行;如果外层方法有事务,则使用外层方法的事务。
(5)PROPAGATION.NOT_SUPPORTED
当前方法总是非事务地执行,如果外层方法有事务则把事务挂起,当前方法还是以普通方法执行。
(6)PROPAGATION.NEVER
如果外层方法没事务,那当前方法就按普通方法执行;如果外层方法有事务,则当前方法抛出异常。
(7)PROPAGATION.MANDATORY
如果外层方法没事务,则当前方法就会抛出异常;如果外层方法有事务,则当前方法使用外层事务。

======================结束==============================

事务推论:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_36324685/article/details/84340072
今日推荐