`
xxp3369
  • 浏览: 152402 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

采用声明式事务

阅读更多
采用声明式事务

1、声明式事务配置
* 配置SessionFactory
* 配置事务管理器
* 事务的传播特性
* 那些类那些方法使用事务

2、编写业务逻辑方法
* 继承HibernateDaoSupport类,使用HibernateTemplate来持久化,HibernateTemplate是
  Hibernate Session的轻量级封装
* 默认情况下运行期异常才会回滚(包括继承了RuntimeException子类),普通异常是不会滚的
* 编写业务逻辑方法时,最好将异常一直向上抛出,在表示层(struts)处理
* 关于事务边界的设置,通常设置到业务层,不要添加到Dao上 

3、了解事务的几种传播特性
1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启
2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行
3. PROPAGATION_MANDATORY: 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
4. PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
5. PROPAGATION_NOT_SUPPORTED: 总是非事务地执行,并挂起任何存在的事务。
6. PROPAGATION_NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常
7. PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务,
     则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行

4、Spring事务的隔离级别
1. ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
     另外四个与JDBC的隔离级别相对应
2. ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。
     这种隔离级别会产生脏读,不可重复读和幻像读。
3. ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据
4. ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。
     它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
5. ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。
     除了防止脏读,不可重复读外,还避免了幻像读。


applicationContext-beans.xml


引用
<?xml version="1.0" encoding="UTF-8"?>

<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-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

<bean id="userManager" class="com.bjsxt.usermgr.manager.UserManagerImpl">
<property name="sessionFactory" ref="sessionFactory"/>
<property name="logManager" ref="logManager"/>
</bean>

<bean id="logManager" class="com.bjsxt.usermgr.manager.LogManagerImpl">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
</beans>
   

applicationContext-common.xml


引用
<?xml version="1.0" encoding="UTF-8"?>

<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-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<!-- 配置sessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>          

<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>

<!-- 配置事务的传播特性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="modify*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>

<!-- 那些类的哪些方法参与事务 -->
<aop:config>
<aop:pointcut id="allManagerMethod" expression="execution(* com.bjsxt.usermgr.manager.*.*(..))"/>
<aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice"/>
</aop:config>
</beans>


hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.url">jdbc:mysql://localhost/spring_hibernate_2</property>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">bjsxt</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.current_session_context_class">thread</property>
		<!-- 
		<property name="hibernate.current_session_context_class">jta</property>
		 -->		
		<mapping resource="com/bjsxt/usermgr/model/User.hbm.xml"/>
		<mapping resource="com/bjsxt/usermgr/model/Log.hbm.xml"/>
	</session-factory>
</hibernate-configuration>


log4j.properties


引用
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file hibernate.log ###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=warn, stdout

#log4j.logger.org.hibernate=info
#log4j.logger.org.hibernate=debug

### log HQL query parser activity
#log4j.logger.org.hibernate.hql.ast.AST=debug

### log just the SQL
#log4j.logger.org.hibernate.SQL=debug

### log JDBC bind parameters ###
#log4j.logger.org.hibernate.type=info
#log4j.logger.org.hibernate.type=debug

### log schema export/update ###
#log4j.logger.org.hibernate.tool.hbm2ddl=debug

### log HQL parse trees
#log4j.logger.org.hibernate.hql=debug

### log cache activity ###
#log4j.logger.org.hibernate.cache=debug

### log transaction activity
#log4j.logger.org.hibernate.transaction=debug

### log JDBC resource acquisition
#log4j.logger.org.hibernate.jdbc=debug

### enable the following line if you want to track down connection ###
### leakages when using DriverManagerConnectionProvider ###
#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace



LogManagerImpl.java


package com.bjsxt.usermgr.manager;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.bjsxt.usermgr.model.Log;
import com.bjsxt.usermgr.util.HibernateUtils;

public class LogManagerImpl extends HibernateDaoSupport implements LogManager {

	public void addLog(Log log) {
		this.getHibernateTemplate().save(log);
	}
}



UserManagerImpl.java

package com.bjsxt.usermgr.manager;

import java.util.Date;

import org.hibernate.Session;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.bjsxt.usermgr.model.Log;
import com.bjsxt.usermgr.model.User;
import com.bjsxt.usermgr.util.HibernateUtils;

public class UserManagerImpl extends HibernateDaoSupport implements UserManager {
	
	private LogManager logManager;
	
//	public void addUser(User user) {
//		this.getHibernateTemplate().save(user);
//		Log log = new Log();
//		log.setType("安全日志");
//		log.setDetail("xxx进入系统");
//		log.setTime(new Date());
//		logManager.addLog(log);
//		throw new java.lang.RuntimeException();
//	}

	public void addUser(User user)
	throws Exception {
		this.getHibernateTemplate().save(user);
		Log log = new Log();
		log.setType("安全日志");
		log.setDetail("xxx进入系统");
		log.setTime(new Date());
		logManager.addLog(log);
		throw new Exception();
	}
	
	public void setLogManager(LogManager logManager) {
		this.logManager = logManager;
	}
}


Client.java

package com.bjsxt.usermgr.client;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.bjsxt.usermgr.manager.UserManager;
import com.bjsxt.usermgr.manager.UserManagerImpl;
import com.bjsxt.usermgr.model.User;

public class Client {

	public static void main(String[] args) {
		User user = new User();
		user.setName("张三");
		
		BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext-*.xml");
		UserManager userManager = (UserManager)factory.getBean("userManager");
		try {
			userManager.addUser(user);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
分享到:
评论

相关推荐

    spring声明式事务配置

    根据提供的信息,我们可以深入探讨Spring框架中的声明式事务配置及其多种实现方式。声明式事务管理是一种简化事务管理的方式,它允许开发人员通过配置而非编程来指定事务边界,从而减少了代码的复杂性并提高了可维护...

    Spring Boot多数据源(支持Spring声明式事务切换和回滚).pdf

    《Spring Boot多数据源(支持Spring声明式事务切换和回滚)》 Spring Boot多数据源技术是构建高效、灵活的多租户SaaS架构的关键。在本文中,我们将深入探讨如何实现动态数据源切换,支持Spring声明式事务管理,并讨论...

    基于java的企业级应用开发:声明式事务管理.ppt

    在Spring框架中,声明式事务管理是实现事务控制的重要手段,它使得开发者无需在代码中显式地管理事务,极大地提高了代码的可维护性和可读性。本篇内容主要涉及两种声明式事务管理方式:基于XML和基于Annotation。 1...

    Spring 整合mybatis(注解&xml版声明式事务).pdf

    如果采用XML配置方式,则需要在Spring的XML配置文件中进行事务配置,并通过aop命名空间来定义事务通知及切点,从而实现声明式事务管理。 对于开发者而言,Spring与MyBatis的整合简化了事务和持久层的处理,减少了...

    关于spring声明式事务管理异常处理的测试和小结

    ### Spring声明式事务管理异常处理测试与总结 #### 背景介绍 Spring框架作为Java企业级应用领域中最重要的框架之一,提供了强大的依赖注入(DI)功能和面向切面编程(AOP)支持,同时也提供了丰富的事务管理机制。...

    MyBatis Spring声明式事务管理示例代码

    Spring的声明式事务管理是采用AOP(Aspect-Oriented Programming,面向切面编程)实现的。在编程式事务管理中,各事务处理代码实际上是相似的,这就造成了代码重复;而且编程式事务管理会造成事务管理代码和被管理的...

    Spring2.5和Hibernate3集成--学习spring aop ioc

    采用声明式事务 1.声明式事务的配置 * 配置sessionFactory * 配置事务管理器 * 配置事务的传播特性 * 配置哪些类哪些方法使用事务 2.编写业务逻辑方法 * 继承HibernateDaoSupport类,使用this....

    struts+hibernate+spring事务配置_花粉册.rar

    在Struts、Hibernate和Spring集成项目中,通常采用声明式事务管理。具体配置如下: 1. 配置Spring的`&lt;tx:annotation-driven&gt;`:在Spring的配置文件(如`applicationContext.xml`)中,添加如下代码,启用基于注解的...

    spring_声明式事务_xml事务的书写.zip

    本教程将深入探讨Spring声明式事务以及如何通过XML配置来管理事务。声明式事务是Spring框架的一大亮点,它允许开发者无需在业务代码中显式处理事务,而是通过配置来控制事务的边界。 首先,我们要理解什么是事务。...

    spring与mybatis整合实现事务配置

    通常我们采用声明式事务管理,通过`&lt;tx:annotation-driven&gt;`标签启用基于注解的事务管理。事务的传播行为、隔离级别、超时时间等可以通过`@Transactional`注解进行配置。 5. **Mapper接口与Service接口**:创建...

    spring3、 hibernate4 配置声明式事务管理(annotation方式)

    本篇将详细介绍如何在Spring 3和Hibernate 4中配置声明式事务管理,采用注解方式。 一、Spring的事务管理 Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理需要在代码中显式地调用...

    SpringTx_account.zip

    在银行转账的案例中,如果不采用声明式事务,可能需要在转账方法内部手动管理事务的生命周期。 接下来,我们关注一下Spring如何处理事务异常。在Spring中,如果@Transactional注解的方法抛出了未检查异常(继承自...

    spring+mybatis的helloworld项目

    在helloworld项目中,我们采用声明式事务管理,即在方法上添加@Transactional注解,Spring容器会在方法执行前后自动进行事务的开启、提交或回滚。 7. **配置文件**:项目中会有Spring的配置文件(如...

    spring编程式事务实现

    在Spring框架中,事务管理是应用开发中的重要一环,它确保了数据的一致性和完整性。Spring提供了两种主要的事务管理方式:声明...然而,在实际应用中,应当根据项目需求和团队习惯来决定采用声明式还是编程式事务管理。

    springmvc-mybatis整合

    在整合环境中,通常采用声明式事务管理,通过@Transactional注解实现。 - **拦截器(Interceptor)**:Spring MVC中的拦截器可以用来进行权限校验、日志记录等预处理或后处理工作。 **5. 示例项目结构** 一个典型的...

    ssh三大框架整合源码

    Spring支持编程式和声明式事务管理,通常在SSH整合中,我们会采用声明式事务,通过@Transactional注解在Service层方法上定义事务边界。 此外,还需要注意异常处理和日志记录。Struts提供了全局异常处理机制,可以...

    Spring实战之使用注解实现声明式事务操作示例

    Spring实战之使用注解实现声明式事务操作示例 在本文中,我们将详细介绍如何使用 Spring 框架来实现声明式事务操作,通过对配置文件和接口实现的分析,来描述如何使用注解来实现事务操作。 事务管理 在 Spring ...

    spring声明事务,编程事务实现

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

    hibernate+spring整合开发

    在`Hibernate` 整合中,通常采用声明式事务管理,通过在方法上添加`@Transactional` 注解来开启和提交事务,简化了事务处理的代码。 3. **配置文件**:整合`Hibernate` 和 `Spring` 需要配置两个主要的文件:`...

    Hibernate编程源代码

    在`HibernateDemo`中,`Session`的`beginTransaction()`和`commit()`方法体现了编程式事务管理,而使用Spring框架时,可以采用声明式事务管理。 综上所述,`HibernateDemo`源代码涵盖了Hibernate的核心概念和使用...

Global site tag (gtag.js) - Google Analytics