Spring框架之事务处理

来源:互联网 发布:免费采购软件有哪些 编辑:程序博客网 时间:2024/05/22 13:17

Spring的事务管理分为声明式跟编程式。声明式就是在Spring的配置文件中进行相关配置;编程式就是用注解的方式写到代码里。

声明式事务管理: 大多数情况下比编程式事务管理更好用. 它将事务管理代码从业务方法中分离出来, 以声明的方式来实现事务管理. 事务管理作为一种横切关注点, 可以通过 AOP 方法模块化. Spring 通过 Spring AOP 框架支持声明式事务管理.
编程式事务管理: 将事务管理代码嵌入到业务方法中来控制事务的提交和回滚. 在编程式管理事务时, 必须在每个事务操作中包含额外的事务管理代码.

Spring的核心事务管理抽象为PlatformTransactionManager,它为事务管理封装了一组独立于技术的方法。无论使用 Spring 的哪种事务管理策略(编程式或声明式), 事务管理器都是必须的。
事务管理器以普通的 Bean 形式声明在 Spring IOC 容器中

事务管理器
Spring并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给Hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现。
Spring事务管理器的接口是org.springframework.transaction.PlatformTransactionManager,通过这个接口,Spring为各个平台如JDBC、Hibernate等都提供了对应的事务管理器,但是具体的实现就是各个平台自己的事情了。

用事务通知声明式地管理事务示例代码
这里写图片描述
除了在带有切入点, 通知和增强器的 Bean 配置文件中声明事务外, Spring 还允许简单地用 @Transactional 注解来标注事务方法.
为了将方法定义为支持事务处理的, 可以为方法添加 @Transactional 注解. 根据 Spring AOP 基于代理机制, 只能标注公有方法.
可以在方法或者类级别上添加 @Transactional 注解. 当把这个注解应用到类上时, 这个类中的所有公共方法都会被定义成支持事务处理的.
在 Bean 配置文件中只需要启用 <tx:annotation-driven>元素, 并为之指定事务管理器就可以了.
如果事务处理器的名称是 transactionManager, 就可以在 元素中省略 transaction-manager 属性. 这个元素会自动检测该名称的事务处理器.

用@Transactional注解声明式地管理事务配置文件示例代码
这里写图片描述

编程式事务
编程式即采用注解的方式,需要注意的是,使用注解的方式需要在Spring的配置文件中加入一句话:,其作用是开启注解的方式。具体配置如下:

开启注解方式<context:annotation-config /> 配置sessionFactory <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">    <property name="configLocation">        <value>classpath:config/hibernate.cfg.xml</value>    </property>    <property name="packagesToScan">        <list>            <value>com.entity</value>        </list>    </property></bean> 配置事务管理器 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">    <property name="sessionFactory" ref="sessionFactory"></property></bean> 第四种配置事务的方式,注解<tx:annotation-driven transaction-manager="transactionManager"/>

注解文件:

@Transactionalpublic class UserDaoImpl_BAK extends HibernateTemplate {        @Transactional(propagation=Propagation.REQUIRED,rollbackForClassName="Exception")    public void addUser(User user) throws Exception {        this.save(user);    }   @Transactional(propagation=Propagation.REQUIRED,rollbackForClassName="Exception")    public void modifyUser(User user) {        this.update(user);    } @Transactional(propagation=Propagation.REQUIRED,rollbackForClassName="Exception")    public void delUser(String username) {        this.delete(this.load(User.class, username));    }    @Transactional(readOnly=true)    public void selectUser() {    }}

注解的方式不太适合比较大的项目,用于简单的小项目还是很好的,其特点就是简单明了。

事务的传播属性
这里写图片描述

参考博客:
http://www.cnblogs.com/newsouls/p/3988216.html
http://blog.csdn.net/asdfsadfasdfsa/article/details/52620261

原创粉丝点击