Spring中的@Transactional以及事务的详细介绍

首先来说下事务,说到事务就不得不说它的四个特性(acid):

一、特性

1.原子性(atomicity):一个事务当作为一个不可分割的最小工作单元,一组操作要么全部成功,要么全部失败。

2.一致性(consistency):必须使数据的一个一致性状态变成另一个一致性状态。举个例子,A和B共有1000元,一人500,他们之间发生了资金上的往来,不管最后各自有多少钱,但是他们的总和还是1000元。

3.隔离性(isolation):在并发的时候,一个事务不能影响到另一事务,相互之间没有任何关系的。

4.持久性(durability):指在事务提交了之后,对数据库中的数据的修改永久的保存下来。

二、事务的隔离级别

1.读未提交(read_uncommited):发生脏读现象-->指一个事务中读取到另一个事务中未提交的数据。解决这种现象,需要将数据库的隔离级别设置为read_commited

2.读已提交(read_commited):会发生不可重复读的现象-->指一个事务中,前后两次查询的数据不一样,在后一次查询到另一个事务对数据进行了更新数据操作并提交了的数据。解决这种情况需要将数据库的隔离级别设置为repeatbale_read。oracle数据库默认的就是这个隔离级别(read_commited)。

3.可重复读(repeatable-read):会发生虚读(幻读)现象-->指在一个事中,前后两次查询的数据不一样,在后一次的查询到另一个事务对数据库做了新增数据并提交了的数据。解决这种情况需要将数据库的隔离级别设置为serializable,mysql数据库的默认级别就是这个(repeatable_read)。

4.序列化(serializable):serializable是事务的最高隔离级别,事务一个个的执行,比较消耗数据库的性能,几乎不用。

注意:不可重复读针对的是update操作,虚读(幻读)针对的是insert操作。这一点容易让人迷惑。

下面来简要的说下Spring中的事务,spring中的事务主要使用的声明式事务,什么不懂什么是声明式事务,事务分为编码式事务,和声明式事务,编码式事务就是你要自己手动的编写事务,获取jdbc的连接啊,设置事务自动提交为false啊,手动commit啊,出现了错误rollback啊。声明式事务就是Spring中的事务处理,使用aop啊,或者注解啊,注解的底层使用的也是aop。

来主要说说@Transactional 中的几个属性代表了啥

propagation 事务的传播机制,下面解释下propagation的几个取值代表什么意思,(默认的取required)

required :没有就创建一个transaction,有的话就不创建
required_new :重新创建一个属于自己的事务,原来有的事务将被挂起
mandatory: 该方法只能存在一个已存在的事务中,自己不能发起事务,如果不存在事务,会抛出异常
supports: 如果存在事务就在此事务下执行,如果没有,就在无事务下执行
not_supported:声明不需要事务,如果关联到一个事务,会将这个事务挂起,调用结束过,原事务接着执行
never:该方法绝不能在事务里面执行,如果关联到事务就报错,该方法只能在无事务里面执行

nested:如果没有,就新建一个事务;如果有,就在当前事务中嵌套其他事务

isolation:事务的隔离级别,它的值就是上面我已经介绍过的几个(read_uncommited,read_commited,repeatable_read,serializable),默认是取数据库的隔离级别,就是你使用哪种数据库,它的隔离级别就是哪个,好比你用的oracle,就是read_commited,或者你用的是mysql,就是repeatable_read.

rollback-for:默认的当程序抛出unchecked的例外(runtimeException以及它的子类),会发生数据的回滚,可以自定义需要哪种异常的情况下回滚数据

read_only :表示只读,不能对数据进行cud.

timeout:表示事务的超时时间:默认的取数据库设置的事务超时时间,如果没有就是无限长,没有时间限制。

no_rellback_for:和rollback_for相反。

注意:@Transactional 作用在方法上的时候,只能作用在Public修饰的方法上。作用在其他的访问控制符上的方法,事务不会生效,也不会报错。

参考: https://www.cnblogs.com/yepei/p/4716112.html

原文地址:https://www.cnblogs.com/zfding/p/8545402.html

时间: 2024-10-28 10:36:24

Spring中的@Transactional以及事务的详细介绍的相关文章

Spring中实现多数据源事务管理

Spring中实现多数据源事务管理 前言 由于项目中引入了多个数据源,并且需要对多个数据源进行写操作,那么多数据源的事务管理自然成了不可避免的问题,这也让我对@Transactional注解有了进一步的理解(但实际上也并不是非常深入) 然而这是一个演进的过程,刚开始项目中并没有使用@Transactional指定具体的TransactionManager,所以新增一个数据源后,对原有的事务产生了影响了,这也是偶尔在一次测试报错而结果没有回滚之后才发现的,遂对于@Transactional注解的一

Spring中的@Transactional

spring中的@Transactional基于动态代理的机制,提供了一种透明的事务管理机制,方便快捷解决在开发中碰到的问题. 一般使用是通过如下代码对方法或接口或类注释: @Transactional(propagation=Propagation.NOT_SUPPORTED) Propagation支持7种不同的传播机制: REQUIRED:如果存在一个事务,则支持当前事务.如果没有事务则开启一个新的事务. SUPPORTS: 如果存在一个事务,支持当前事务.如果没有事务,则非事务的执行.但

Linux中的lo回环接口详细介绍

1.linux的网络接口之扫盲 (1)网络接口的命名 这里并不存在一定的命名规范,但网络接口名字的定义一般都是要有意义的.例如: eth0: ethernet的简写,一般用于以太网接口. wifi0:wifi是无线局域网,因此wifi0一般指无线网络接口. ath0: Atheros的简写,一般指Atheros芯片所包含的无线网络接口. lo: local的简写,一般指本地环回接口. (2)网络接口如何工作 网络接口是用来发送和接受数据包的基本设备. 系统中的所有网络接口组成一个链状结构,应用层

Spring中的@Transactional深度分析之二

5.   @Transactional之isolation 隔离级别所要解决的问题是在应用程序中,存在多个事务同时在运行之时,需要解决和处理好的问题.那首先来看看,一般会出现哪些问题呢?先来看看吧. 脏读(dirty read) 一个事物更新了数据库中的某些数据,另一个事物读取了这些数据,这时前一个事物由于某些原因回滚了,那么第二个事物读取的数据就是"脏数据" 不可重复读(non-repeatable read) 一个事物需要两次查询同一数据,但两次查询中间可能有另外一个事物更改了这个

[转]使用spring中的@Transactional注解时,可能需要注意的地方

前情提要 在编写业务层方法时,会遇到很多需要事务提交的操作,spring框架为我们提供很方便的做法,就是在需要事务提交的方法上添加@Transactional注解,比起我们自己开启事务.提交以及控制回滚,要简单的多.但是在使用的时候容易犯一些错误.我就自己的错误经历总结如下. 枯燥的背景知识(可以忽略) 编程式事务管理&声明式事务管理: (一)编程式事务管理 在 Spring 出现以前,编程式事务管理对基于 POJO 的应用来说是唯一选择.用过 Hibernate 的人都知道,我们需要在代码中显

coding++:Spring中的@Transactional(rollbackFor = Exception.class)属性详解

异常: 如下图所示,我们都知道 Exception 分为 运行时异常 RuntimeException 和 非运行时异常. error 是一定会回滚的. 如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止. 如果不想终止,则必须捕获所有的运行时异常,决不让这个处理线程退出.队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志. 不应该由于异常数据而影响下面对正常数据的处理. 非运行时异常是 RuntimeException 以外的异常,类型上都属

spring中使用aop配置事务

spring的事务配置有5种方式,这里记录其中的一种:基于tx/aop声明式事务配置 在之前spring aop介绍和示例这篇所附代码的基础上进行测试 一.添加save方法 1.在testDao类里添加方法: /** * 保存实体 */ public void save(testInfo info) { sessionFactory.getCurrentSession().save(info); } 2.在HelloController类里添加方法: /** * 保存实体 * @param re

[转载]C++中引用与指针的区别(详细介绍)

本文转载自http://www.cnblogs.com/tracylee/archive/2012/12/04/2801519.html C++中的引用与指针的区别 指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过void*指针操作对象必须进行类型转化.     ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址: 引

spring 中配置定时调度两种方法介绍

方法一: 直接用jdk api的Timer类,无需配置spring文件 1.用@compent注解,实现InitializingBean接口 ,spirng会自动去查找afterPropertiesSet()方法, 2.在afterPropertiesSet方法中写业务实现,调用timer的schedule方法或者scheduleAtFixedRate方法 schedule(TimerTask task, Date time) 安排在指定的时间执行指定的任务. scheduleAtFixedRa