Java事务的类型有三种:

JDBC事务、 可以将多个 SQL 语句结合到一个事务中。JDBC 事务的一个缺点是事务的范围局限于一个数据库连接。一个 JDBC 事务不能跨越多个数据库

JTA(Java Transaction API)事务、事务可以跨越多个数据库或多个DAO,使用也比较复杂。

容器事务。主要指的是J2EE应用服务器提供的事务管理,局限于EJB应用使用。

spring事务的配置方式编程式事务和声明式事务,相信大家都知道是有5种,但我们经常使用的应该就是基于注解和tx标签配置拦截器两种方式了

1
2
3
4
5
6
7
8
9
10
   <bean id="sessionFactory"
         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">   
        <property name="configLocation" value="classpath:hibernate.cfg.xml" />   
        <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> 
    </bean>
<!-- 定义事务管理器(声明式的事务) -->
  <bean id="transactionManager"
      class="org.springframework.orm.hibernate3.HibernateTransactionManager"
      <property name="sessionFactory" ref="sessionFactory" /> 
  </bean>

ps:声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

1、基于注解,DAO上需加上@Transactional注解

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

2、使用tx标签配置的拦截器

1
2
3
4
5
6
7
8
9
10
11
12
<tx:advice id="txAdvice" transaction-manager="transactionManager"
    <tx:attributes
        <tx:method name="*" propagation="REQUIRED" /> 
    </tx:attributes
</tx:advice
 
<aop:config
    <aop:pointcut id="interceptorPointCuts"
        expression="execution(* com.bluesky.spring.dao.*.*(..))" /> 
    <aop:advisor advice-ref="txAdvice"
        pointcut-ref="interceptorPointCuts" />         
</aop:config>

3、使用拦截器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<bean id="transactionInterceptor"
       class="org.springframework.transaction.interceptor.TransactionInterceptor">   
       <property name="transactionManager" ref="transactionManager" />   
       <!-- 配置事务属性 -->
       <property name="transactionAttributes">   
           <props>   
               <prop key="*">PROPAGATION_REQUIRED</prop>   
           </props>   
       </property>   
   </bean
 
   <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">   
       <property name="beanNames">   
           <list>   
               <value>*Dao</value
           </list>   
       </property>   
       <property name="interceptorNames">   
           <list>   
               <value>transactionInterceptor</value>   
           </list>   
       </property>   
   </bean>

4、所有Bean共享一个代理基类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<bean id="transactionBase"
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
        lazy-init="true" abstract="true">   
    <!-- 配置事务管理器 -->
    <property name="transactionManager" ref="transactionManager" />   
    <!-- 配置事务属性 -->
    <property name="transactionAttributes">   
        <props>   
            <prop key="*">PROPAGATION_REQUIRED</prop>   
        </props>   
    </property>   
</bean>
    <!-- 配置DAO -->
    <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl"
        <property name="sessionFactory" ref="sessionFactory" /> 
    </bean
 
    <bean id="userDao" parent="transactionBase" >   
        <property name="target" ref="userDaoTarget" />    
    </bean>

5、每个Bean都有一个代理

1
2
3
4
5
6
7
8
9
10
11
12
13
<bean id="userDao"
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">   
           <!-- 配置事务管理器 -->
           <property name="transactionManager" ref="transactionManager" />      
        <property name="target" ref="userDaoTarget" />   
         <property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" /> 
        <!-- 配置事务属性 -->
        <property name="transactionAttributes">   
            <props>   
                <prop key="*">PROPAGATION_REQUIRED</prop
            </props>   
        </property>   
    </bean>

Spring配置事务的五种方式的更多相关文章

  1. spring事务之——spring配置事务的五种方式

    Spring配置文件中关于事务配置总是由三个部分组成,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSo ...

  2. Spring 配置 事务的几种方式

    Spring配置文件中关于事务配置总是由三个组成部分,DataSource.TransactionManager和代理机制这三部分,无论是那种配置方法,一般变化的只是代理机制这块! 首先我创建了两个类 ...

  3. spring配置属性的两种方式

    spring配置属性有两种方式,第一种方式通过context命名空间中的property-placeholder标签 <context:property-placeholder location ...

  4. Spring 实现事务的三种方式

    事务:保证数据的运行不会说A给B钱,A钱给了B却没收到. 实现事务的三种方式(重要代码): 1.aspectJ AOP实现事务: <bean id="dataSourceTransac ...

  5. SSH2配置事务的两种方式

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  6. 【Spring】19、spring配置数据源的4种方式

    不管采用何种持久化技术,都需要定义数据源.Spring中提供了4种不同形式的数据源配置方式: spring自带的数据源(DriverManagerDataSource),DBCP数据源,C3P0数据源 ...

  7. Spring配置dataSource的三种方式 数据库连接池

    1.使用org.springframework.jdbc.dataSource.DriverManagerDataSource 说明:DriverManagerDataSource建立连接是只要有连接 ...

  8. 浅谈spring配置定时任务的几种方式

    网上看到好多关于定时任务的讲解,以前只简单使用过注解方式,今天项目中看到基于配置的方式实现定时任务,自己做个总结,作为备忘录吧. 基于注解方式的定时任务 首先spring-mvc.xml的配置文件中添 ...

  9. spring注入bean的五种方式

    1.属性注入 2.构造方法注入 3.静态工厂注入 package com.voole.factorybeans; import com.voole.beans.TestBean; public cla ...

随机推荐

  1. Computers(线性DP)

    描述 Everybody is fond of computers, but buying a new one is always a money challenge. Fortunately, th ...

  2. hexo干货系列:(七)hexo安装统计插件

    前言 前面介绍了如何让百度和谷歌收录我们的博客,那如何查看自己的博客每天被多少人访问呢~ 这里我介绍下hexo中如何使用统计插件,每天看到自己的博客访问量越来越高也是一种享受. 正文 开启统计功能 我 ...

  3. 洛谷P1757 通天之分组背包

    题目背景 直达通天路·小A历险记第二篇 题目描述 自01背包问世之后,小A对此深感兴趣.一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品相互冲突,现在,他想知道最大 ...

  4. 【POJ1185】炮兵阵地(状压DP)

    题意: 思路:状压DP经典题 可以预处理下每一行内合法的状态,发现很少 所以转移时可以使用状态的编号而不是状态本身 DP时记录前两行状态的编号进行转移和判断 #include<cstdio> ...

  5. Object-C Xcode 编译提示 note: please rebuild precompiled header ZWYLPrefixHeader

    错误提示如下图 解决思路: 由于手欠不小心,在.pch文件上的第一行加了几个文字,删除以后,还有一个空行,估计是这个空行引起的.删除这个空行,就好了.

  6. 洛谷—— P1656 炸铁路

    P1656 炸铁路 题目描述 因为某国被某红色政权残酷的高压暴力统治.美国派出将军uim,对该国进行战略性措施,以解救涂炭的生灵. 该国有n个城市,这些城市以铁路相连.任意两个城市都可以通过铁路直接或 ...

  7. 2018.11.5 PION模拟赛

    期望:30 + 40 + 50 = 120 实际:30 + 50 + 40 = 120 ‘’ 思路:最重要的是发现 是完全没有用的,然后这个题目就可以转成DP来做. /* 期望的分:30 */ #in ...

  8. NodeJS+MongoDB+AngularJS+Bootstrap书店示例

    目录 一.Bootstrap 1.1.添加引用 1.2.在页面中使用BootStrap 1.3.可视化布局 二.使用MongoDB创建数据库 2.1.启动MongoDB数据库 2.2.启动数据库GUI ...

  9. Objective-c写冒泡排序

    做面试题遇到用obj-c写冒泡排序,随便写了个 - (NSMutableArray *)sorted:(NSMutableArray *)array { int len = [array count] ...

  10. (转)Delphi2009初体验 - 语言篇 - 智能指针(Smart Pointer)的实现

     转载:http://www.cnblogs.com/felixYeou/archive/2008/08/27/1277250.html 快速导航 一. 回顾历史二. 智能指针简介三. Delphi中 ...