spring的事务操作

我们项目一期已经差不多结束了,所以一些细节也被拿了出来,出现最多的就是事务的操作了。因为自己负责的是一个模块(因为是另外一个项目的负责人),所以组员经常会遇到事务的问题,会出现很多奇葩的用法,各种乱用,估计他们就知道在方法上面注解@Transactional,但是其中的很多细节都不知道。所以经常会出现一个情况,就是一大坨代码出现了事务的问题,然后我就去各种改。所以今天也对事务做一个总结吧。以后忘记了可以回来看看。

一般我们使用事务最主要注重的是三个方面:

1.propagation:传播性  
   2:isolation:事务的隔离级别
   3:readOnly是否只读

其中在单独使用不带任何参数的 @Transactional 注释时,传播模式要设置为 REQUIRED,只读标志设置为 false,事务隔离级别设置为 READ_COMMITTED,而且事务不会针对受控异常(checked exception)回滚。

传播性:

 *    3.propagation:传播性
 *            <br>Propagation取值:
            REQUIRED(默认值):在有transaction状态下执行;如当前没有transaction,则创建新的transaction;
            SUPPORTS:如当前有transaction,则在transaction状态下执行;如果当前没有transaction,在无transaction状态下执行;
            MANDATORY:必须在有transaction状态下执行,如果当前没有transaction,则抛出异常IllegalTransactionStateException;
            REQUIRES_NEW:创建新的transaction并执行;如果当前已有transaction,则将当前transaction挂起;
            NOT_SUPPORTED:在无transaction状态下执行;如果当前已有transaction,则将当前transaction挂起;
            NEVER:在无transaction状态下执行;如果当前已有transaction,则抛出异常IllegalTransactionStateException
            PROPAGATION_NESTED(嵌入式事务):通过创建Savepoint实现嵌套事务,达到内层事务若抛出异常(unchecked exception)则回滚到savepoint处,但不影响外层事务;外层事务的回滚会一起回滚内层事务;
            (对于spring-jdbc和mybatis有用  但是对于hibernate的sessionFactory是没有有用的)

隔离级别

 *    1.isolation:事务的隔离级别
 *            spring的事务隔离级别
            ISOLATION_DEFAULT:使用数据库默认的隔离级别。 spring中默认是READ_COMMITTED
            ISOLATION_READ_UNCOMMITTED:允许读取改变了的还未提交的数据,可能导致脏读、不可重复读和幻读。
            ISOLATION_READ_COMMITTED:允许并发事务提交之后读取,可以避免脏读,可能导致重复读和幻读。
            ISOLATION_REPEATABLE_READ:对相同字段的多次读取结果一致,可导致幻读。
            ISOLATION_SERIALIZABLE:完全服从ACID的原则,确保不发生脏读、不可重复读和幻读。

是否只读:

6.readOnly是否只读  默认不是只读(false)  如果没有事务的时候 那么这个设置会被忽略

1.其中我们需要注意的地方是,我们在使用orm框架的时候,是需要使用事务来触发sql的执行的。所以在我们使用orm框架中都会使用事务。而且很重要的是在hibernate典型的no session错误也有一大大部分问题是出在没有添加事务。
2.第二个注意点就是说如果我们选择的策略中没有事务,那么设置了是否只读属性没有任何的作用的。
3.其他几个属性的作用:

    timeout事务的响应时间 ,如果超过时间 那么就会出现错误。单位是秒
    noRollbackFor:指定异常类不会回滚,在默认的情况下  事务回滚只对于RuntimeException的异常有用(只对非checked的异常回滚)
    noRollbackForClassName:和上面是相同的意思  但是这里是指定异常的名称
   value名称
时间: 2024-09-30 09:23:59

spring的事务操作的相关文章

spring的事务操作(重点)

这篇文章一起来回顾复习下spring的事务操作.事务是spring的重点, 也是面试的必问知识点之一. 说来这次面试期间,也问到了我,由于平时用到的比较少,也没有关注过这一块的东西,所以回答的不是特别好,所以借这一篇文章来回顾总结一下,有需要的朋友,也可以点赞收藏一下,复习一下这方面的知识,为年后的面试做准备. 首先,了解一下什么是事务? --- 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行. 事务处理可以确

Spring之事务操作(注解)

事务操作步骤: <!-- 第一步.配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <

Spring之事务操作(配置文件)

UserDao.java 1 package helloworld.tx; 2 3 import org.springframework.jdbc.core.JdbcTemplate; 4 5 public class UserDao { 6 7 private JdbcTemplate jdbcTemplate; 8 9 public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { 10 this.jdbcTemplate = jdbcTem

如何处理Spring、Ibatis结合MySQL数据库使用时的事务操作

Ibatis是MyBatis的前身,它是一个开源的持久层框架.它的核心是SqlMap--将实体Bean跟关系数据库进行映射,将业务代码和SQL语句的书写进行分开.Ibatis是"半自动化"的ORM持久层框架.这里的"半自动化"是相对Hibernate等提供了全面的数据库封装机制的"全自动化"ORM实现而言的,"全自动"ORM实现了POJO与数据库表字段之间的映射并且实现了SQL的自动生成和执行.而Ibatis的着力点,则在于P

spring(三) spring事务操作

前面一篇博文讲解了什么是AOP.学会了写AOP的实现,但是并没有实际运用起来,这一篇博文就算是对AOP技术应用的进阶把,重点是事务的处理. --wh 一.jdbcTemplate 什么是JdbcTemplate? spring提供用于操作数据库模版,类似Dbutils,通俗点讲,我们操作数据库,spring也会帮我们提供一个操作数据库的工具供我们使用,而不用我们自己手动编写连接数据库,获取结果集等等操作,这个工具就是JdbcTemplate.跟Dbutils一样,想要使用JdbcTemplate

spring学习(三) ———— spring事务操作

前面一篇博文讲解了什么是AOP.学会了写AOP的实现,但是并没有实际运用起来,这一篇博文就算是对AOP技术应用的进阶把,重点是事务的处理. --wh 一.jdbcTemplate 什么是JdbcTemplate? spring提供用于操作数据库模版,类似Dbutils,通俗点讲,我们操作数据库,spring也会帮我们提供一个操作数据库的工具供我们使用,而不用我们自己手动编写连接数据库,获取结果集等等操作,这个工具就是JdbcTemplate.跟Dbutils一样,想要使用JdbcTemplate

Java框架spring学习笔记(十八):事务操作

事务操作创建service和dao类,完成注入关系 service层叫业务逻辑层 dao层单纯对数据库操作层,在dao层不添加业务 假设现在有一个转账的需求,狗蛋有10000元,建国有20000元,狗蛋向建国转账1000元钱. 编写service层创建业务逻辑,OrderService.java 1 import cn.dao.OrderDao; 2 3 public class OrderService { 4 private OrderDao orderDao; 5 6 public voi

Spring的事务机制

JAVA EE传统事务机制 通常有两种事务策略:全局事务和局部事务.全局事务可以跨多个事务性资源(即数据源,典型的是数据库和消息队列),通常都需要J2EE应用服务器的管理,其底层需要服务器的JTA支持.而局部事务则与底层采用的持久化技术有关,如果底层直接使用JDBC,需要用Connection对象来操事务.如果采用Hibernate持久化技术,则需要使用session对象来操作事务. 通常的,使用JTA事务,JDBC事务及Hibernate事务的编程流程大致如下, 上图也可以看出,采用传统事务编

spring与事务管理

就我接触到的事务,使用最多的事务管理器是JDBC事务管理器.现在就记录下在spring中是如何使用JDBC事务管理器 1)在spring中配置事务管理器 <!-- JDBC事务 -->    <bean id="jdbcTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">        <property