`
hyp1987
  • 浏览: 4457 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring transactions

 
阅读更多

想起小时候,玩翘翘板,如果同伴不玩的话,那两个人就都玩不了,只能一起玩,或者都不玩,在软件中,发生或都不发生(all-or-noting)就称做事务了。事务保证在一个单元内的所有操作要么都发生要么都不发生。

用四个词来概括事务就是:原子性(Atomic)一致性(Consistent,隔离性(Isolated,持久性(Durable,简称ACID.

Spring ejb一样,支持两种事务,编程式事务和声明式事务。编程式事务允许你通过代码去控制你的事务,声明式事务允许你通过容器来定义事务的条件,隔离级别,和超时等。不管你选择哪种事务,你都将用到spring 的事务管理接口,不同的平台,spring都有不同的实现,下表是spring针对不同的数据操作提供的事务管理:

 

Transaction manager (org.springframework.*)

Use it when...

 

jca.cci.connection.

Using Springs support for Java EE Connector Architec-
ture (JCA) and the Common Client Interface (CCI).

 
 

CciLocalTransactionManager

Working with Springs JDBC abstraction support. Also

 

jdbc.datasource.DataSourceTransactionManager

useful when using iBATIS for persistence.

 

jms.connection.JmsTransactionManager

Using JMS 1.1+.

 

jms.connection.JmsTransactionManager102

Using JMS 1.0.2.

 

orm.hibernate3.HibernateTransactionManager

Using Hibernate 3 for persistence.

 

orm.jdo.JdoTransactionManager

Using JDO for persistence.

 

orm.jpa.JpaTransactionManager

Using the Java Persistence API (JPA) for persistence.

 

transaction.jta.JtaTransactionManager

You need distributed transactions or when no other
transaction manager fits the need.

 
 

transaction.jta.OC4JJtaTransactionManager

Using Oracles OC4J JEE container.

 

transaction.jta.WebLogicJtaTransactionManager

You need distributed transactions and your application is
running within WebLogic.

 

transaction.jta.WebSphereUowTransactionManager

You need transactions managed by a UOWManager in WebSphere.

 

 

 

JDBC事务:

<bean id="transactionManager" class="org.springframework.jdbc.

datasource.DataSourceTransactionManager">

<property name="dataSource" ref="dataSource"/>

</bean>

Hiberante事务:

<bean id="transactionManager" class="org.springframework.

      orm.hibernate3.HibernateTransactionManager">

<property name="sessionFactory" ref="sessionFactory"/>

</bean>

Jpa事务:

<bean id="transactionManager"

   class="org.springframework.orm.jpa.JpaTransactionManager">

<property name="entityManagerFactory" ref="entityManagerFactory" />

</bean>

下边这个是不知道用哪个事务的时候用,或者有多个事务源的时候用

<bean id="transactionManager" class="org.springframework.

transaction.jta.JtaTransactionManager">

<property name="transactionManagerName"

value="java:/TransactionManager" />

</bean>

下边介绍下编程式事务和声明式事务:

编程式事务:直接看代码例子吧

public void saveSpittle(final Spittle spittle) {

         txTemplate.execute(new TransactionCallback<Void>() {

                   public Void doInTransaction(TransactionStatus txStatus) {

                            try {

                                              spitterDao.saveSpittle(spittle);

                                               } catch (RuntimeException e) {

                                               txStatus.setRollbackOnly();

                                               throw e;

                            }

                   return null;

                   }

                   });

}

注入txTemplate

<bean id="spitterService"

   class="com.habuma.spitter.service.SpitterServiceImpl">

...

<property name="transactionTemplate ">

<bean class="org.springframework.transaction.support.

TransactionTemplate">

<property name="transactionManager"

ref="transactionManager" />

</bean>

</property>

</bean>

声明式事务:首先讲下声明式事务的五个属性吧

事务的传播级别(Propagation,事务的隔离性(Isolation,(不)回滚条件(Rollback rules,超时时间(Timeout,是否只读(Read-only),

1.spring中事务配置属性以及@Transaction对应的默认值。一般使用默认值即可,特殊情况自定义。
1)事务传播行为(propagation):默认PROPAGATION_REQUIRED
2)事务隔离级别(isolation):默认ISOLATION_DEFAULT(数据库默认的隔离级别)
3)只读还是读写(readonly):默认读写事务。
4)异常发生时回滚还是提交(rollback-for/no-rollback-for):默认checked异常引发回滚,unchecked异常继续提交。

 

Propagation7种可选的值,分别是:

PROPAGATION_MANDATORY,需要在有事务的情况下运行,否则throw exception

PROPAGATION_NESTED ,内联事务,就是如果一个事务已经在运行了,会重新开启内置一个事务,可以提交,回滚,如果没有事务在运行,情况就和PROPAGATION_REQUIRED一样,

PROPAGATION_NEVER不多说,和PROPAGATION_MANDATORY完全相反

PROPAGATION_NOT_SUPPORTED:不需要在事务在运行,如果当前有事务,那么当前程序会挂起。

PROPAGATION_REQUIRED需要在事务的环境下运行,没有的话会新建一个事务。

PROPAGATION_ REQUIRES_NEW:new一个新的事务,在自己的事务里运行

PROPAGATION_SUPPORTS:以有事务环境下运行,如果有事务的话。

 

Isolation,隔离级别是用来防止脏读,不可重复读,幽灵数据,隔离级别有下边5个可选属性:

ISOLATION_DEFAULT, ISOLATION_READ_UNCOMMITTED(允许读没有提交的数据,上边三种读都是防止不了的)ISOLATION_READ_COMMITTED(允许读提交了的数据,能防止脏读),

ISOLATION_REPEATABLE_READ(能防止脏读和不可重复读), ISOLATION_SERIALIZABLE(都能防止了,ACID级别的了,全加锁,不过也是最慢的了)

Read-only,只读事务,这个需要配置的程序在事务环境下运行

Transaction Timeout 事务超时

Rollback rules 回滚条件

下边讲下这五个属性在xml文件中是如何配置的:首先加入声明吧

<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:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/

spring-beans-3.0.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-3.0.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"

注意,这里边要加入aop的声明,因为事务的切入点用到了

配置形式:

<tx:advice id="txAdvice">

         <tx:attributes>

                   <tx:method name="add*" propagation="REQUIRED" />

                   <tx:method name="*" propagation="SUPPORTS"

                   read-only="true"/>

         </tx:attributes>

</tx:advice>

<tx:method>用上边讲述的5个属性来定义事务

 

Attribute

Purpose

 

isolation

Specifies the transaction isolation level.

 

propagation

Defines the transactions propagation rule.

 

read-only

Specifies that a transaction be read-only.

 

Rollback rules:

rollback-for specifies checked exceptions for which a transaction

 

rollback-for

should be rolled back and not committed.

 

no-rollback-for

no-rollback-for specifies exceptions for which the transaction
should continue and not be rolled back.

 
 

timeout

Defines a timeout for a long-running transaction.

 

下边配置切入点:

<aop:config>

         <aop:advisor

         pointcut="execution(* *..SpitterService.*(..))"

         advice-ref="txAdvice"/>

</aop:config>

通过注解方式配置:

<tx:annotation-driven transaction-manager="txManager" />,这句话就告诉spring去检查上下文中所有的bean,和用@Transactional标注了的。看下边的例子:

 

@Transactional(propagation=Propagation.SUPPORTS, readOnly=true)

public class SpitterServiceImpl implements SpitterService {

...

         @Transactional(propagation=Propagation.REQUIRED, readOnly=false)

         public void addSpitter(Spitter spitter) {

         ...

         }

         ...

}

 

6.常见的错误:
是希望在service方法中catch到spring的异常,抛出一个自定义异常,但是不继承自DataAccessException的。可惜的是这样做是catch不到spring的异常的。

原因:
spring是靠捕获方法抛出的DataAccessException来处理事务的,若被我们自己catch到了,spring就不可能再捕获到异常,就没法处理事务了。

解决:
可以在service方法中catch到spring的异常,然后抛出一个自定义但必须继承自DataAccessException的异常。因为自定义的异常是继承自DataAccessException的,因此spring能够catch到并处理事务的。

 

7,在事务属性为REQUIRED时,在相同线程中进行相互嵌套调用的事务方法工作于相同的事务中。如果互相嵌套调用的事务方法工作在不同线程中,则不同线程下的事务方法工作在独立的事务中。

 

 From spring in action 3

分享到:
评论

相关推荐

    spring4.3.9最全jar包下载

    Spring Transactions模块提供了声明式和编程式事务管理,确保数据的一致性和完整性。 7. **Spring AOP**: - 提供了实现AOP的工具,如定义切点、通知、代理等,方便实现如日志、性能监控、安全控制等横切关注点。 ...

    spring-lib.rar

    6. **Spring Transactions**:事务管理模块,支持编程式和声明式事务管理,确保数据的一致性和完整性。 7. **Spring Web Services**:用于创建和消费Web服务,支持WS-Security等标准协议。 8. **Spring Test**:...

    spring-2.5常用项目包

    Spring Transactions模块提供了声明式和编程式的事务管理,确保了数据的一致性。 8. **Spring Web Services**:Spring对Web服务的支持,包括SOAP和RESTful风格的服务创建,以及客户端调用。 在实际开发中,根据...

    springframework.rar

    综上所述,"springframework.rar"文件包含了构建基于Spring的应用程序所需的全部或部分库,可能包括Spring Core、Spring Context、Spring AOP、Spring MVC、Spring Data以及Spring Transactions等模块。开发者可以...

    spring各类齐全JAR包

    6. **Spring Transactions**:提供统一的事务管理接口,支持编程式和声明式事务管理。 7. **Spring Web Services**:用于构建基于SOAP和RESTful的Web服务。 8. **Spring Boot**:简化了Spring应用的初始搭建以及开发...

    spring 4.1.5 官方lib包

    7. **Spring Transactions**:提供了一致的事务管理接口,支持编程式和声明式事务管理。 8. **Spring Web**:包含用于处理HTTP请求的工具,如Servlet监听器和过滤器。 9. **Spring Test**:提供了测试支持,包括...

    springDemo

    5. **Spring Transactions**:提供声明式和编程式的事务管理,确保数据一致性。 6. **Spring Boot**:快速启动Spring应用的工具,通过默认配置和自动配置简化了Spring应用的初始化和部署过程。 7. **Spring Profiles...

    spring3.1.1所有jar包

    6. **Spring Transactions**:提供了声明式和编程式的事务管理,使得事务控制变得简单且易于维护。 7. **Spring Web Services**:支持创建和消费Web服务,包括SOAP和RESTful风格的服务。 8. **Spring Test**:提供...

    精通spring.rar(PDF)

    8. **Spring transactions**:Spring的事务管理模块支持声明式和编程式的事务管理,可以在不同数据源上进行事务控制,保证数据的一致性和完整性。 9. **Spring Web服务**:Spring Web Services模块支持创建和消费...

    spring常用架包

    7. **Spring Transactions**:事务管理模块,提供了声明式和编程式事务管理,确保数据一致性。声明式事务管理只需在方法上添加@Transactional注解,无需编写额外的事务控制代码。 8. **Spring MVC**:Model-View-...

    spring3.0jar包

    5. **Spring Transactions**:事务管理模块提供了声明式和编程式的事务管理,允许在多个数据库操作之间保持一致性的ACID(原子性、一致性、隔离性和持久性)属性。这对于企业级应用尤其重要,确保了数据的完整性和...

    Spring4 jar包和Spring配置文件

    5. **Spring Transactions**:事务管理模块,支持编程式和声明式事务管理,使得事务管理更加简单和可靠。 6. **Spring Web Services**:提供创建基于SOAP和RESTful的Web服务工具。 在压缩包中的"Spring4"目录下,...

    spring的相关库文件

    5. **Spring Transactions**: 支持声明式和编程式的事务管理,使得事务管理变得简单且易于维护。在多数据源或分布式系统中,这是必不可少的。 6. **Spring ORM**: 集成了流行的对象关系映射(ORM)框架,如...

    Spring开发jar包完整

    6. **Spring Transactions**:提供了一种声明式和编程式的事务管理方式,可以在不同类型的事务管理器(如JTA、DataSource)之间切换,确保事务的正确性和一致性。 7. **Spring Web Services**:用于构建基于SOAP和...

    spring一些常用的jar包

    除了上述核心组件,Spring框架还包括了其他模块,如Spring MVC(用于Web应用的模型-视图-控制器架构)、Spring JDBC(简化JDBC操作)、Spring ORM(支持多种ORM框架如Hibernate、MyBatis)、Spring Transactions...

    Spring中文开发手册下载 CHM

    6. **Spring Transactions**:提供了声明式和编程式事务管理,使得事务处理更加直观和一致。 7. **Spring Web Services**:支持创建和消费Web服务,提供基于WSDL的契约优先开发模式。 8. **Spring AMQP**和**...

    Spring所有jar包

    8. **Spring Transactions**: - 事务管理支持编程式和声明式方式,适用于多种数据源。 9. **Spring Web Services**: - 提供了创建和消费Web服务的工具,支持WSDL-first和XML Schema-first两种方式。 10. **...

    spring-framework-4.3.2.jar下载,自己整合的一个Spring包,希望能帮助大家

    7. **Spring Transactions**:提供了统一的事务管理接口,支持编程式和声明式事务管理,适用于不同的事务API如JTA、JDBC、Hibernate等。 8. **Spring Aspects**:提供了基于AspectJ的AOP支持,使得切面可以被编译到...

    spring mvc,hibernate,spring 整合项目源码,导入即可直接运行

    Spring 还包含许多模块,如Spring JDBC、Spring ORM(包括对Hibernate的支持)、Spring Transactions等,用于简化数据库交互和事务管理。 在这个整合项目中,Spring MVC 作为前端控制器负责接收HTTP请求,并通过...

    spring-framework-3.2.5.RELEASE.rar

    - **Spring Transactions**:统一的事务管理,支持编程式和声明式事务。 - **Spring Test**:提供了单元测试和集成测试的支持。 6. **配置和使用** 开发者可以使用XML配置文件或者基于注解的方式配置Spring容器...

Global site tag (gtag.js) - Google Analytics