spring 事务 笔记3.1

Spring事务

以前的事务都是编程式事务,需要开启和关闭,然后程序写在这里面

spring,声明式事务

Spring事务隔离级别

DEFAULT         使用数据库默认隔离级别
READ_UNCOMMITTED   允许读取尚未提交的数据。可能导致脏读、幻读或不可重复读。
READ_COMMITTED     允许从已经提交的并发事务读取。可以防止脏读,但依然会出现幻读和不可重复读。
REPEATABLE_READ     对相同字段的多次读取结果是相同的,除非数据被当前事务改变。可以防止脏读和不可重
              复读,但幻读依然出现。
SERIALIZABLE        完全符合ACID的隔离级别,确保不会发生脏读,幻读和不可重复读。

脏读:    一个事务读取到另一个事务没有提交到的数据。
不可重复读:   在同一事务中,多次读取同一数据返回的结果不同。
幻读:    一个事务读取到另一个事务已经提交的事务。

==============================================

Spring事务传播属性

REQUIRED
  业务方法需要在一个事务中运行。如果方法运行时,已经处在一个事务中,那么加入到这个事务中,
  否则自己创建一个事务。(大部分情况下使用)
NOT-SUPPORTED
  声明方法需要事务。如果方法没有关联到一个事务,容器会为它开启一个事务,如果方法在
  一个事务中被调用,该事务将会被挂起,在方法调用结束后 ,原先的事务会恢复执行。
REQUIREDNEW
  业务方法必须在自己的事务中运行。一个新的事务将被启动,而且如果有一个事务正在运行,
  则将这个事务挂起,方法运行结束后,新事务执行结束,原来的事务恢复运行。
  MANDATORY 该方法必须运行在一个现有的事务中,自身不能创建事务,如果方法在没有事务的环境下被调用,
  则会抛出异常。
SUPPORTS
  如果该方法在一个事务环境中运行,那么就在这个事务中运行,如果在事务范围外调用,那么就在
  一个没有事务的环境下运行。
NEVER
  表示该方法不能在有事务的环境下运行,如果在有事务运行的环境下调用,则会抛出异常
NESTED
  如果一个活动的事务存在, 则运行在一个嵌套的事 务中, 如果没 有活动事务, 则按照REQUIRED事
  务方式执行。该事务可以独立的进行提交或回滚,如果回滚不会对外围事务造成影响

=========================================

spring事务出现在service层

1.建立jdbc事务管理器 

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>    

2.基于xml配置的事务 需要导入schema

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       <!-- 这一句 -->
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
<!-- 这一句 -->
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"
>

事务通知

<!-- 事务通知 transaction-manager="transactionManager"跟上面事务管理器的配置的id相同-->
    <tx:advice id="advice" transaction-manager="transactionManager">
        <tx:attributes>
            <!-- method指的是service类中的哪些方法需要加事务,以及加哪种事务
                isolation隔离级别    propagation传播属性
                find*表示只要是以find开头的都加上事务,查询的时候read-only="true"表示只读,性能比较高-->
            <tx:method name="save*" isolation="DEFAULT" propagation="REQUIRED"/>
            <tx:method name="find*" read-only="true"/>
            <tx:method name="eidt*"/>
            <tx:method name="del*"/>
        </tx:attributes>
    </tx:advice>    
<!-- AOP  通知加到哪些类上了 -->
    <aop:config>
        <aop:pointcut expression="execution(* com.kaishengit.service..*.*(..))" id="pt"/>
        <!-- 通知引用上面的id  advice-ref="advice"   pointcut-ref="pt"上面的id-->
        <aop:advisor advice-ref="advice" pointcut-ref="pt"/>
    </aop:config>

举例

@Named
public class StudentService {

    @Inject
    private StudentDao studentDao;

    public void save(Student stu){
        studentDao.save(stu);
        if(1==1){
            throw new RuntimeException();
        }
        studentDao.save(stu);
    }

    public Student findById(int id) {
        return studentDao.findById(id);
    }
}
    

============================================

2.基于于Annotation的事务

JDBC事务管理器

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

基于注解的事务

<tx:annotation-driven transaction-manager="transactionManager"/>

举例

@Named
@Transactional
public class StudentService {

    @Inject
    private StudentDao studentDao;

    public void save(Student stu){
        studentDao.save(stu);
        if(1==1){
            throw new RuntimeException();
        }
        studentDao.save(stu);
    }

    @Transactional(readOnly=true)
    public Student findById(int id) {
        return studentDao.findById(id);
    }
}    

事务在发生异常的时候才会回滚,如果在service中调用的Dao中的方法,在dao中
直接try catch掉了,是不会回滚的,使用spring,执行的sql默认是向上抛出运行时异常。意思就是说
spring默认的 是只有出现运行时异常才会回滚
if(1==1){
throw new Exception();
}

但是是可以修改的

@Named
/*默认的是 @Transactional(rollbackFor=RuntimeException.class)*/
@Transactional(rollbackFor=Exception.class)
public class StudentService {

    @Inject
    private StudentDao studentDao;

    public void save(Student stu){
        studentDao.save(stu);
        if(1==1){
            throw new RuntimeException();
        }
        studentDao.save(stu);
    }

    @Transactional(readOnly=true)
    public Student findById(int id) {
        return studentDao.findById(id);
    }
}        
时间: 2024-08-19 21:27:17

spring 事务 笔记3.1的相关文章

Spring学习笔记(四)-- Spring事务全面分析

通过本系列的文章对Spring的介绍,我们对Spring的使用和两个核心功能IOC.AOP已经有了初步的了解,结合我个人工作的情况,由于项目是金融系 统,那对事务的控制是必不可少的,并且是非常严格的控制.根据我对项目的研究,它在管理模块用的是JTA的事务,而在交易模块用的是JDBC的事 务,但是,所有的这些事务的使用,都是用Spring封装后的编程式事务.我在看完<Spring In Action>后,在网上看了下大家对Spring事务的理解,貌 似都没有真正的文章是去全面剖析Spring对这

spring学习笔记:spring事务管理 (转)

关于事物隔离级别, 脏读, 不可重复读, 幻读的理解, 另有一篇文章比较生动的介绍:http://blog.csdn.net/sunxing007/article/details/6427290 spring事务管理相关的接口: TransactionDefinition:代表一个事物,描述了事务的隔离级别, 超时时间,事务是否只读, 传播规则等等; TransactionStatus:描述事物的状态; PlatformTransactionManager:事务管理器接口, 只定义了3个方法:g

不错的Spring学习笔记(转)

Spring学习笔记(1)----简单的实例 ---------------------------------   首先需要准备Spring包,可从官方网站上下载.   下载解压后,必须的两个包是spring.jar和commons-logging.jar.此外为了便于测试加入了JUnit包.   在Myeclipse中创建Java项目.   编写一个接口类,为了简单,只加入了一个方法.   Java代码   1.package com.szy.spring.interfacebean;  

Spring 事务传递教程_有实例

通过这篇文章,你将学习到Spring框架中中事务的传递 1. 简介 在处理Spring管理的事务时,开发人员可以以传播的方式定义事务的行为.换句话说,开发人员能够决定业务方法如何被封装在逻辑和物理事务中.来自不同Spring bean的不同方法可以在相同的事务范围或分割为多个嵌套的事务中执行.这可能导致像内部事务产生的结果如何影响外部事务的细节.我们将在下一节中看到Spring中不同的传播机制的不同行为. 本教程将仅关注事务的传播机制行为.Spring事务的其他方面的细节,你可以参考其他的教程或

《Spring学习笔记》:Spring、Hibernate、struts2的整合(以例子来慢慢讲解,篇幅较长)

<Spring学习笔记>:Spring.Hibernate.struts2的整合(以例子来慢慢讲解,篇幅较长) 最近在看马士兵老师的关于Spring方面的视频,讲解的挺好的,到了Spring.Hibernate.struts2整合这里,由于是以例子的形式来对Spring+Hibernate+struts2这3大框架进行整合,因此,自己还跟着写代码的过程中,发现还是遇到了很多问题,因此,就记录下. 特此说明:本篇博文完全参考于马士兵老师的<Spring视频教程>. 本篇博文均以如下这

Spring事务SPI及配置介绍

Spring事务SPI及配置介绍 标签: spring事务aop数据管理 2015-05-17 11:42 606人阅读 评论(0) 收藏 举报  分类: Spring(12)  版权声明:本文为博主原创文章,未经博主允许不得转载. Spring事务管理的抽象,核心的三个接口:PlatformTransactionManager.TransactionDefinition和TransactionStatus.关系如下图所示: TransactionDefinition:定义了Spring兼容的事

spring 事务管理详解 学习心得

今天,我终于登上了你的诺曼底,spring事务. 在此之前,一谈起spring我就没底,虽然用的很顺手,但是其中的AOP和事务一直未理解和掌握,数次尝试突破都未成功,之前看过很多网上的相关文章和书籍,要么基于的版本不同,有的基于spring2有的基于spring3:要么切入点不同,有的讲的太低级,我都懂,有的讲的太庞杂,我晕了...... 从这周一开始,我决定在试一下.计划每天的上午专门学习,横扫各大网站,收集文章,然后对其分类,整理记笔记,到周二坚持一个一个的看,规整,理解,熟记,本子下写下了

Spring学习笔记一(Spring核心思想)

通过学习<Spring in action (Third edition)>的第一章,我大概了解了Spring的基本思想: 1,依赖注入(Dependnecy Injection): 在不使用Spring框架的情况下,一个类要跟另一个类建立联系,可能会使用如下的模式: class A{...} class B{ private A a; ...       } 这样的话,每次实例化一个B的对象,如b1,必定实例化一个A的对象,如a1,并且b1和a1是紧耦合的,b1牢牢地和a1绑定在一起了.他们

Spring零散笔记

IOC(控制反转),也称DI(Denpendency Inject依赖注入).1.把自己new的东西改为由容器提供. 初始化具体bean 动态装配2.好处:灵活配置. 控制反转:将控制权交给容器依赖注入:setdao根据实际的dao注入(setdao依赖于实际的dao) spring是一个IOC容器,可以实例化具体的bean,还可以动态装配.还支持AOP:安全检查,管理transaction. FAQ:不给提示a.window-preferences-myeclipse-xml catalogb