9.spring:事务管理(下):声明式事务管理

声明式事务管理

sprin的声明式事务是管理AOP技术实现的事务管理,其本质是是对方法前后进行拦截,然后

在目标方法开始之前创建或者加入一个事务,在执行完成目标方法之后根据执行情况提交或者回滚事务。

声明式事务管理优点:不需要通过编程的方式管理事务,因而不需要在业务逻辑代码中掺杂事务处理的代码,

    只需相关的事务规则声明便可以将事务规则应用到业务逻辑中。

    在开发中使用声明式事务处理不仅因为其简单,更主要是这样可以使纯业务代码不被污染,方便后期的维护。

声明式事务管理不足之处:是最细粒纯度只能作用到方法级别,无法做到像编程事务管理那样作用到代码块级别。

spring的声明式事务管理可以通过两种方式实现:1、xml配置方式 2、使用@Transactionl注解方式

1).xml配置方式

public interface TestDao {

    public int save(String sql,Object p []);
    public int delete(String sql,Object p []);
}
@Repository("TestDao")
public class TestDaoImpl  implements TestDao{

    @Autowired
    private JdbcTemplate jdbcTemplate ;

    @Override
    public int save(String sql, Object[] p) {

        return jdbcTemplate.update(sql, p);
    }

    @Override
    public int delete(String sql, Object[] p) {
        // TODO Auto-generated method stub
        return jdbcTemplate.update(sql, p);
    }
}
public interface TestService {

    public int save(String sql,Object p []);
    public int delete(String sql,Object p []);
}
@Service("TestService")
public class TestServiceImpl implements TestService{

    @Autowired
    private TestDao testDao ;

    @Override
    public int save(String sql, Object[] p) {

        return testDao.save(sql, p);
    }

    @Override
    public int delete(String sql, Object[] p) {
        // TODO Auto-generated method stub
        return testDao.delete(sql, p);
    }
}

spring配置文件

<!--扫描指定的包-->
<context:component-scan base-package="com.MrChegnse.jdbctest"></context:component-scan>

<!-- 配置数据源 -->
<bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
     <property name="driverClassName"  value="com.mysql.jdbc.Driver" />
     <property name="url" value="jdbc:mysql://127.0.0.1:3306/tx" />
     <property name="username" value="root" />
     <property name="password" value="1234" />
</bean> 

<!-- 配置jdbc模块 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"></property>
</bean>

<!-- 为数据源添加事物管理 -->
<bean id="dataSourceTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>

<!-- 编写声明式事物 -->
<!-- transaction-manager:DataSourceTransactionManager类的实例化 -->
<tx:advice id="myAdvice" transaction-manager="dataSourceTransactionManager">
    <tx:attributes>       <!-- * 表示任意的方法 -->
        <tx:method name="*"/>
    </tx:attributes>
</tx:advice>

<!-- 编写AOP让spring自动对目标生成代理 -->
<aop:config>
    <!-- 定义切点 -->
    <aop:pointcut expression="execution(* com.MrChegnse.jdbctest.*.*())" id="point"/>

    <!-- 切面:将切入点与通知关联 -->
    <aop:advisor advice-ref="myAdvice" pointcut-ref="point"/>
</aop:config>

测试

     public ApplicationContext getapp(){
         return new
                 ClassPathXmlApplicationContext("tx.xml");
     }

  public String test11(){

    TestService testService = (TestService) getapp().getBean("testService");
    String msg2 = "";

    Object a [] = {2,"user2","pwd2"};
    String sql = "insert into user values(?,?,?)";

    try {
      testService.save(sql, a);
    } catch (Exception e) {

      msg2 ="error";
      e.printStackTrace();
    }
    return msg2;
  }

  @Test
  public void test22(){
    String a = test11();
      System.out.println(a);
   }

注:

1、<tx:advice>配置事务的通知

2、<tx:advice>一般需要指定id和transaction-manager属性,id是在配置文件中唯一标识,transaction-manager指定事务管理器

3、<tx:attributes>是<tx:advice>的子元素、执行执行事务的细节

4、<tx:advice>配置了事务增强处理后就可通过AOP配置让spring自动对目标生成代理

5、<aop:pointcut expression="execution(* com.MrChegnse.jdbctest.*.*())" id="point"/>

  *:代表任意类型、任意类、任意方法

6、<aop:advisor advice-ref="myAdvice" pointcut-ref="point"/>:将切入点与通知关联

  

 2)@Transactionl注解声明式事务管理

public interface TestDao {
    public int save(String sql,Object p []);
    public int delete(String sql,Object p []);
}
@Repository("TestDao")
public class TestDaoImpl  implements TestDao{
    @Autowired
    private JdbcTemplate jdbcTemplate ;

    @Override
    public int save(String sql, Object[] p) {
        return jdbcTemplate.update(sql, p);
    }

    @Override
    public int delete(String sql, Object[] p) {
        // TODO Auto-generated method stub
        return jdbcTemplate.update(sql, p);
    }
}
public interface TestService {

    public int save(String sql,Object p []);
    public int delete(String sql,Object p []);
}
@Service("TestService")
@Transactional
public class TestServiceImpl implements TestService{
    @Autowired
    private TestDao testDao ;

    @Override
    public int save(String sql, Object[] p) {
        return testDao.save(sql, p);
    }

    @Override
    public int delete(String sql, Object[] p) {
        // TODO Auto-generated method stub
        return testDao.delete(sql, p);
    }
}

spring的配置文件

<context:component-scan base-package="com.MrChegnse.jdbctest"></context:component-scan>

<!-- 配置数据源 -->
<bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
     <property name="driverClassName"  value="com.mysql.jdbc.Driver" />
     <property name="url" value="jdbc:mysql://127.0.0.1:3306/tx" />
     <property name="username" value="root" />
     <property name="password" value="1234" />
</bean> 

<!-- 配置jdbc模块 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"></property>
</bean>

<!-- 为数据源添加事物管理 -->
<bean id="dataSourceTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>

<!-- 为事务管理器注册注解驱动 -->
<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>

测试

public String test11(){
        TestService testService = (TestService) getapp().getBean("testService");
        String msg2 = "";

        Object a [] = {2,"user2","pwd2"};
        String sql = "insert into user values(?,?,?)";

        try {
            testService.save(sql, a);
        } catch (Exception e) {

            msg2 ="error";
            e.printStackTrace();
        }
        return msg2;
    }

    @Test
    public void test22(){
        String a = test11();
        System.out.println(a);
    }

注:

1、@Transactional:可以作用于接口、接口方法、类以及类的方法

2、当作用于类上时,该类的所有public方法都将具有该类型的事务属性,同时也可以在方法级别使用该注解来覆盖类级别的定义

3、Spring小组建议不要在接口或者方法上使用该注解,因为他只有在使用基于接口的代理时才会生效。

4、@Transactional(rollbackFor=RuntimeException.class):不对RuntimeException回滚生效

5、@Transactional(rollbackFor=Exception.class):不对Exception回滚生效

6、<tx:annotation-driven />:为事务管理器注册注解驱动驱动器

7、  @Transactional

  public class TestServiceImpl implements TestService{

  加上注解就可以指定这个类需要接受Spring的事务管理

  只能针对public属性范围内的方法添加

基本完结..........

原文地址:https://www.cnblogs.com/Mrchengs/p/10100116.html

时间: 2024-12-20 12:01:18

9.spring:事务管理(下):声明式事务管理的相关文章

全面分析 Spring 的编程式事务管理及声明式事务管理--转

开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本教程假定您已经掌握了 Java 基础知识,并对 Spring 有一定了解.您还需要具备基本的事务管理的知识,比如:事务的定义,隔离级别的概念,等等.本文将直接使用这些概念而不做详细解释.另外,您最好掌握数据库的基础知识,虽然这不是必须. 系统需求 要试验这份教程中的工具和示例,硬件配置需求为:至少带

spring事物配置,声明式事务管理和基于@Transactional注解的使用

参考来源:http://blog.csdn.net/bao19901210/article/details/41724355 事物管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性. spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager.对于编程式事务管理,spring推荐使用TransactionTemplate. 声明式事务管理建立在A

分析 Spring 的编程式事务管理及声明式事务管理(转)

开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本教程假定您已经掌握了 Java 基础知识,并对 Spring 有一定了解.您还需要具备基本的事务管理的知识,比如:事务的定义,隔离级别的概念,等等.本文将直接使用这些概念而不做详细解释.另外,您最好掌握数据库的基础知识,虽然这不是必须. 系统需求 要试验这份教程中的工具和示例,硬件配置需求为:至少带

Spring 的编程式事务管理及声明式事务管理

本文将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. Spring 事务属性分析 事务管理对于企业应用而言至关重要.它保证了用户的每一次操作都是可靠的,即便出现了异常的访问情况,也不至于破坏后台数据的完整性.就像银行的自助取款机,通常都能正常为客户服务,但是也难免遇到操作过程中机器突然出故障的情况,此时,事务就必须确保出故障前对账户的操作不生效,就像用户刚才完全没有使用过取款机一样,以保

全面分析 Spring 的编程式事务管理及声明式事务管理

转自:http://www.open-open.com/lib/view/open1414310646012.html 关于本教程 本教程将深切讲授 Spring 庞杂而丁壮夜的事务治理功用,包括编程式事务和声明式事务.经由进程对本教程的进修,您将可以理解 Spring 事务治理的实质,并无邪运用之. 先决前提 本教程假定您已掌控了 Java 根蒂根抵常识,并对 Spring 有一定意见.您还需求具有根抵的事务治理的常识,好比:事务的界说,隔离级其他概念,等等.本文将直接行使这些概念而不做具体正

spring学习笔记(22)声明式事务配置,readOnly无效写无异常

在上一节内容中,我们使用了编程式方法来配置事务,这样的优点是我们对每个方法的控制性很强,比如我需要用到什么事务,在什么位置如果出现异常需要回滚等,可以进行非常细粒度的配置.但在实际开发中,我们可能并不需要这样细粒度的配置.另一方面,如果我们的项目很大,service层方法很多,单独为每个方法配置事务也是一件很繁琐的事情.而且也可能会造成大量重复代码的冗杂堆积.面对这些缺点,我们首要想到的就是我们spring中的AOP了.spring声明式事务的实现恰建立在AOP之上. 在这一篇文章中,我们介绍s

【Spring】Spring使用XML配置声明式事务

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 一.事务介绍 事务简介: 事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性 事务就是一系列的动作,它们被当作一个单独的工作单元.这些动作要么全部完成,要么全部不起作用. 事务的四个关键属性(ACID) ① 原子性(atomicity):事务室一个原子操作,有一系列动作组成.事务的原子性确保动作要么全部完成,要么完全不起作用② 一致性(consistency):一旦所

spring笔记--事务管理之声明式事务

事务简介: 事务管理是企业级应用开发中必不可少的技术,主要用来确保数据的完整性和一致性, 事务:就是一系列动作,它们被当作一个独立的工作单元,这些动作要么全部完成,要么全部不起作用. Spring中使用事务: 作为一个受欢迎的企业应用框架,Spring在不同的事务管理API上定义了一个抽象层,而开发时不必了解底层的事务管理API,就可以使用Spring的事务管理机制. Spring既支持编程式的事务管理,也支持声明式的事务管理,大多数情况我们选择后者. 编程式事务管理:将事务管理代码嵌入到业务代

Spring(十五)之声明式事务

声明式事务管理方法允许你在配置的帮助下而不是源代码硬编程来管理事务.这意味着你可以将事务管理从事务代码中隔离出来.你可以只使用注释或基于配置的 XML 来管理事务. bean 配置会指定事务型方法.下面是与声明式事务相关的步骤: 我们使用标签,它创建一个事务处理的建议,同时,我们定义一个匹配所有方法的切入点,我们希望这些方法是事务型的并且会引用事务型的建议. 如果在事务型配置中包含了一个方法的名称,那么创建的建议在调用方法之前就会在事务中开始进行. 目标方法会在 try / catch 块中执行

spring的学习____12 声明式事务(AoP的横向织入)

1.事务的介绍: 事务涉及到数据的一致性问题. 事务:要么都成功,要么都不成功! 事务的四大特性: ACID :原子性:一致性:隔离性:持久性. 编程中遇到的实际问题: 在如下的实现类(UserDaoImpl)中,执行了:先添加一个user,再删除一个user的操作,最后打印出所有的用户列表. 当我们人为的在删除代码写错时(即就不能成功执行删除操作),发现程序还是执行了添加和打印用户列表的其余两步,这就不符合事物的一致性. public class UserDaoImpl implements