Spring基于声明式的事务管理

事务管理

Spring提供了编码式和声明式事务管理的支持。

编码式事务允许用户在代码中精确定义事务的边界,而声明式事务(基于AOP)用助于用户将操作与事务解耦。

选择编码式还是声明式在很大程度上是在细粒度控制和易用性之间权衡。

Spring并不直接管理事务,而是提供多种事务管理器,将它们事务管理职责委托给JTA或其他持久化机制所提供的平台相关的事务实现。每个事务管理器都会充当某一特定平台的事务实现的门面,这使得用户在Spring中使用事务时,不用关注事务的实际实现是什么。

JDBC事务

<bean
id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

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

</bean>

Hibernate事务

<bean
id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">

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

</bean>

Spring对声明式的事务是通过AOP框架来完成。

声明式事务是通过事务属性来定义的,事务属性描述了事务策略如何应用到方法上,事务属性包括5个方面:传播行为、隔离级别、是否只读、事务超时、回滚规则。

传播行为:定义了客户端与被调用方法之间的事务边界。

隔离级别:一个事务可能受其它并发事务的影响程度。

在并发事务中可能会出现脏读、不可重复度、幻读的数据操作问题,因此要求并发事务之间隔离。隔离级别:

是否只读:事务对后端的数据库进行只读操作,数据库可以利用事务的只读特性来进行一些特定的优化。

事务超时:如果一个事务执行的时间太长,就会导致占用资源,因此,我们通常设定一个事务超时时间,当超过这个时间,就会导致事务超时,那么事务就会回滚。

回滚规则:事务在默认时遇到运行时异常就会回滚,而检查时异常不会回滚。我们也可以设定在遇到特定检查时异常回滚来定义自己的回滚规则。

在XML中通过tx命名空间来定义事务通知

<tx:advice
id="txAdvice">

<tx:attributes
>

<tx:method
name=""
isolation="DEFAULT"/>

<tx:method
name=""
no-rollback-for=""/>

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

<tx:method
name=""
read-only="false"/>

<tx:method
name=""
timeout="-1"/>

</tx:attributes>

</tx:advice>

//name表示与事务属性相关联的方法

<tx:advice>声明一个事务,<tx:attributes>定义事务的属性

在我们声明事务的同时,还需要使用事务管理器:

<tx:adviceid="txAdvice" transaction-manager="transactionManager">

………..

</tx:advice>

到现在我们只是定义了事务通知,我们还应该声明哪些Bean应该被通知,因此我们就需要通过AOP切点来完成:

<aop:config>

<aop:advisor
advice-ref="teAdvice"
pointcut="exectution(*bean.User.*(..))"/>

</aop:config>

到现在为止我们已经完全了解了声明式事务方法。

我们同样可以通过注解来简化我们的XML的事务,我们只需要在XML中使用:<tx:annotation-driven  transaction-manager="txManager"/>

然后在Bean上注解@Transactional,事务属性是通过注解的属性来完成,对于每一个@Transactional注解的Bean,<tx:annotation-driven/>会自动为其添加事务通知。

实例一:

<bean
id="t" 
class="test.Test01"></bean>

<bean 
id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property
name="driverClassName"
value="com.mysql.jdbc.Driver "
</property>

<property
name="url"
value="jdbc:mysql://localhost:3306/dataBase">  
</property>

<property
name="username"
value="root"></property>

<property
name="password"
value=""></property>

</bean>

<bean
id="jdbcTemplate"
class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">

<constructor-arg
ref="dataSource"></constructor-arg>

</bean>

<bean
id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

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

</bean>

<tx:advice
id="txAdvice"transaction-manager="transactionManager">

<tx:attributes
>

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

<tx:method
name=""
read-only="false"/>

</tx:attributes>

</tx:advice>

<aop:config>

<aop:advisor
advice-ref="txAdvice"
pointcut=" execution(**..Test01.update(..)) "/>

</aop:config>

public
class
Test01 {

public SimpleJdbcTemplategetSimpleJdbcTemplate() {

ApplicationContext ac=newClassPathXmlApplicationContext("applicationContext.xml");

SimpleJdbcTemplate  stj=ac.getBean("jdbcTemplate",SimpleJdbcTemplate.class);

return stj;

}

public
int
update(String sql)

{

return
this
.getSimpleJdbcTemplate().update(sql);

}

public
static void
main(String[] args) {

Test01 t=new Test01();

SimpleJdbcTemplate  stj=t.getSimpleJdbcTemplate();

String insertsql="insertinto users values(10,‘lisi‘,2)";

introw=t.update(insertsql);

System.out.println(row);}

}

实例二:

<bean
id="t" 
class="test.Test01"></bean>

<bean 
id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property
name="driverClassName"
value="com.mysql.jdbc.Driver "
</property>

<property
name="url"
value="jdbc:mysql://localhost:3306/dataBase">  
</property>

<property
name="username"
value="root"></property>

<property
name="password"
value=""></property>

</bean>

<bean
id="jdbcTemplate"
class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">

<constructor-arg
ref="dataSource"></constructor-arg>

</bean>

<bean
id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

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

</bean>

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

</beans>

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

public
int
update(String sql)

{

return
this
.getSimpleJdbcTemplate().update(sql);

}

时间: 2024-10-29 19:09:05

Spring基于声明式的事务管理的相关文章

8.Spring整合Hibernate_2_声明式的事务管理(Annotation的方式)

声明式的事务管理(AOP的主要用途之一) (Annotation的方式) 1.加入annotation.xsd 2.加入txManager bean 3.<tx:annotation-driven 1 <tx:annotation-driven transaction-manager="txManager"/> 2 <bean id="txManager" class="org.springframework.orm.hiberna

9.Spring整合Hibernate_2_声明式的事务管理(Xml的方式)

使用xml的方式进行声明式的事务管理 推荐使用xml的方式,因为可以同时为多个方法进行声明 1 <!-- 开启Spring中的事务管理(声明式的事务管理) xml--> 2 3 <!-- 不管是通过 xml 还是注解的方式 来进行声明式的事务管理,都需要 加载TransactionManager或 DataSouce 4 因为 事务是与是与数据库相关的,需要数据库一些配置信息 5 --> 6 <bean id="txManager" class="

Spring整合hibernate:3、使用XML进行声明式的事务管理

配置applicationContext.xml文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 <?xml version="1.0" encoding=&qu

spring aop 声明式事务管理

Spring使用AOP来完成声明式的事务管理   有annotation和xml两种形式 代码和上一篇基本相近,再贴一遍 两个实体类 package com.ouc.wkp.model; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity(name = "t_log") public class Log { priva

Spring学习之Spring的声明式事务管理详解

声明式事务管理 大多数Spring用户选择声明式事务管理的原因是,这个是对应用代码影响最小的选择,因此也最符合 非侵入式 轻量级容器的理念. Spring声明式事务管理可以在任何环境下使用.只需更改配置文件, 它就可以和JDBC.JDO.Hibernate或其他的事务机制一起工作. Spring的声明式事务管理可以被应用到任何类(以及那个类的实例)上. Spring提供了声明式的回滚规则. Spring允许你通过AOP定制事务行为.(例如,如果需要,你可以在事务回滚中插入定制的行为. 你也可以增

spring mvc + mybatis + spring aop声明式事务管理没有作用

在最近的一个项目中,采用springMVC.mybatis,发现一个很恼人的问题:事务管理不起作用!!网上查阅了大量的资料,尝试了各种解决办法,亦未能解决问题! spring版本:3.0.5 mybatis版本:3.2.2 1.applicationContext.xml配置: mvc + mybatis + spring aop声明式事务管理没有作用" title="spring mvc + mybatis + spring aop声明式事务管理没有作用">2.spr

转 Spring @Transactional 声明式事务管理 getCurrentSession

Spring @Transactional声明式事务管理  getCurrentSession   在Spring @Transactional声明式事务管理的配置中,hibernate.current_session_context_class=thread- 这一句是不能加的-加了就会出错..那为什么不能加呢? 那是因为在Spring事务管理中,current Session是绑定到SpringSessionContext中的,而不是ThreadLocalSessionContext中的 先

Spring的声明式事务管理&lt;tx:advice/&gt; 有关的设置

<tx:advice/> 有关的设置 这一节里将描述通过 <tx:advice/> 标签来指定不同的事务性设置.默认的 <tx:advice/> 设置如下: 事务传播设置是 REQUIRED 隔离级别是 DEFAULT 事务是 读/写 事务超时默认是依赖于事务系统的,或者事务超时没有被支持. 任何 RuntimeException 将触发事务回滚,但是任何 checked Exception 将不触发事务回滚 这些默认的设置当然也是可以被改变的. <tx:advi

Spring之声明式事务

在讲声明式事务之前,先回顾一下基本的编程式事务 编程式事务: //1.获取Connection对象 Connection conn = JDBCUtils.getConnection(); try { //2.开启事务:取消自动提交 conn.setAutoCommit(false); //3.执行数据库操作 chain.doFilter(req,resp); //4.提交事务 conn.commit(); }catch(Exception e) { //5.回滚事务 conn.rollBack