`
wlh269
  • 浏览: 455776 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多
===============JDBC手动事务========================


/**
	 * 添加流向单
	 * @param flowCard
	 */
	public void addFlowCard(FlowCard flowCard) {
		//Connection conn = null;
		try {
		
			//~~~~~取得Connection~~~~~//
			conn = ConnectionManager.getConnection();
		
			//~~~~~自动提交设置为false~~~~~//
			conn.setAutoCommit(false);
			
			//取得流向单号
			String vouNo = flowCardDao.getVouNo();
			flowCard.setVouNo(vouNo);
			//保存流向单主表
			flowCardDao.addFlowCardMaster(flowCard);
			//保存流向单明细
			flowCardDao.addFlowCardDetail(vouNo, flowCard.getFlowCardDetailList());
			
			//~~~~~~~提交事务~~~~~~~~~~~//
			conn.commit();
			
		}catch(AppException e) {
			if (e.getErrorCode() == ErrorInfo.ERROR_CODE_GEN_FLOW_CARD_VOU_NO
				|| e.getErrorCode() == ErrorInfo.ERROR_CODE_SAVE_FLOWCARD_DETAIL
				|| e.getErrorCode() == ErrorInfo.ERROR_CODE_SAVE_FLOWCARD_MASTER
			) {
				throw new AppException("添加流向单失败!");
			}
		}catch(Exception e) {
			e.printStackTrace();
			try {
			
			 //~~~~~~~事务回滚~~~~~~~~~~~//
				conn.rollback();
			} catch (SQLException e1) {
		 TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}finally {
			ConnectionManager.closeConnection();
		}
	}



===============Hibernate手动事务(需要手动开启,回滚和关闭事务)========================
	
	public class UserManagerImpl implements UserManager {
      Session session=null;
      Transaction tx=null;
	public void addUser(User user) {
		try{
			 //得到当前一个session然后放到threadLocale中,在事务关闭之前可以在项目的任何地方,
			 //使用sessionFactory.getCurrentSession()得到该Session,不需要传递
			session= HibernateUtils.getFactory().getCurrentSession();
			
				//~~~~~得到事务对象~~~~~//
			tx=session.beginTransaction();
			
			session.save(user);
			
			Log log=new Log();
			log.setDate(new Date());
			log.setDetails("XXXX做了什么XXXX");
			log.setType("操作日志");
			LogManager logManager=new LogManagerImpl();
			logManager.addLog(log);
			//throw new java.lang.RuntimeException();//制造异常
			//出现运行期异常,事务自动回滚,数据库没有添加记录
			
			
			//~~~~~~~提交事务~~~~~~~~~~~//
			tx.commit();
		}catch(Exception e){
			e.printStackTrace();
			
		//~~~~~~~事务回滚~~~~~~~~~~~//
			tx.rollback();
		}
		
	}

}

public class LogManagerImpl implements LogManager {
	public void addLog( Log log) {
		HibernateUtils.getFactory().getCurrentSession().save(log);

	}

}



===============Hibernate声明式事务管理========================
 
 a.	用户管理类UserManagerImpl继承模板类HibernateDaoSupport
 
	public class UserManagerImpl extends HibernateDaoSupport implements UserManager {
	
	private LogManager logManager;
	public void addUser(User user) throws Exception {
		this.getHibernateTemplate().save(user);
		
		Log log = new Log();
		log.setType("操作日志");
		log.setDetails("xxx做了xxxxx");
		log.setDate(new Date());
		logManager.addLog(log);
		
		//throw new java.lang.RuntimeException();//制造异常
		throw new Exception();//制造异常,普通异常,事务不回滚
	}
	
	//注入LogManager
	public void setLogManager(LogManager logManager) {
		this.logManager = logManager;
	}

}

b.日志管理类LogManagerImpl继承模板类HibernateDaoSupport
public class LogManagerImpl extends HibernateDaoSupport  implements LogManager {

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

}

c. 事务管理配置

<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"/>
	</bean>
	<!-- 配置事务管理器 -->
	<bean id="transactionMgr" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
	 <property name="sessionFactory">
  		<ref bean="sessionFactory"/>			 
 	 </property>
	</bean>
	<!-- 配置事务传播特性 -->
	<tx:advice id="txAdvice" transaction-manager="transactionMgr">
		 <tx:attributes>
			 <tx:method name="add*" propagation="REQUIRED"/> 
			  <tx:method name="del*" propagation="REQUIRED"/>
			  <tx:method name="update*" propagation="REQUIRED"/>
			  <tx:method name="*" read-only="true"/>
		 </tx:attributes>
	</tx:advice>
	<!-- 那些类使用事务 -->
	<aop:config>
	  <aop:pointcut id="point-cut" expression="execution(* com.wlh.spring.manager.*.*(..))"/>
	  <aop:advisor advice-ref="txAdvice" pointcut-ref="point-cut"/>
	</aop:config>

	
</beans>
分享到:
评论

相关推荐

    数据库事务总结 数据库事务总结

    ### 数据库事务总结 #### 一、事务的基本概念与特性 **事务**是数据库系统中的一个逻辑工作单元,它由一系列的操作组成,这些操作要么都完成,要么都不完成,以此来保证数据的一致性和完整性。 #### 二、事务的...

    Java事务总结.docx

    ### Java事务总结 #### 事务的基本概念与属性 在计算机科学中,特别是在数据库管理系统中,**事务**是一种机制,用于确保一系列操作作为一个整体被执行。事务包含三个基本的行为:开始事务、提交事务以及回滚事务...

    sqlserver嵌套事务总结

    该文档从sqlserver事务讲起,详述ACID,@@trancount,在嵌套事务中使用保存点,命名事务等

    spring事务总结.docx

    然而,在实际开发过程中,经常会遇到一些关于Spring事务的问题,如事务失效、事务回滚、大事务问题以及编程式事务等。本文将深入探讨这些问题,并给出相应的解决方案。 #### 一、事务不生效的原因及解决办法 1. **...

    分布式事务思维导图总结

    分布式事务总结,包括了目前所知道的理论,二段三段saga协议。但没有包括一致性算法

    数据库事务总结

    事务的基本特征;事务的隔离级别;在数据库操作过程中很可能出现几种不确定的情况;不同的隔离级别对事务的处理;在选取数据库的隔离级别时,应该注意以下几个处理的原则:.锁,锁的特点,多个用户同时对数据库的并发...

    Spring事务总结

    编程式事务管理需要在代码中显式地开始、提交或回滚事务,而声明式事务管理则是通过在配置文件中声明事务规则,让Spring自动管理事务的生命周期,更加简洁和易于维护。 在给定的描述中,我们看到项目采用了SSH...

    Java事务处理总结

    ### Java事务处理总结 #### 一、什么是Java事务 事务是指一组操作的集合,这些操作要么全部成功,要么全部失败,以确保数据的一致性和完整性。在Java开发中,事务处理主要关注的是如何管理和控制对数据库的操作,...

    Java中JDBC事务与JTA分布式事务总结与区别

    总结来说,JDBC事务适用于单数据库、简单事务需求的场景,其API简洁,性能较好,但不具备分布式事务能力。而JTA事务则适用于需要跨数据库、复杂分布式事务的环境,虽然使用起来相对复杂,但能够保证大规模分布式系统...

    Java事务处理总结[归类].pdf

    Java事务处理是编程中确保数据一致性和完整性的关键机制,特别是在涉及数据库操作的场景下。事务处理遵循ACID原则,即原子性、一致性、隔离性和持久性。原子性确保事务作为一个不可分割的操作单元,要么全部执行,...

    Mongodb事务介绍与最佳实践.pptx

    ### 事务总结 - **Snapshot 隔离**:事务内部的查询始终看到事务开始时的数据,不受其他并发事务的影响。 - **MVCC 机制**:通过记录多个版本的文档,确保并发事务间的冲突检测和恢复。 理解这些核心原理和最佳...

    java事务处理总结

    ### Java事务处理总结 在Java开发中,事务处理是一项非常重要的技术,它能够确保数据的一致性和完整性。本文将从多个角度对Java中的事务处理进行深入解析,帮助开发者更好地理解和运用这一技术。 #### 一、事务的...

    JAVA事务配置总结

    本文将对三种不同的事务配置方式进行深入探讨:本地事务、全局事务以及结合动态数据源的事务管理。这些配置方式在处理多数据源和复杂业务场景时具有不同的优势和适用性。 首先,我们来看“本地事务”。本地事务通常...

    C# 事务处理总结的word文档

    总结来说,C#中的事务处理涉及到如何在单个数据库和分布式环境中确保数据的一致性。理解事务的基本原则,掌握C#中的事务管理工具和策略,以及熟悉处理分布式事务和异常情况的方法,对于任何从事数据库驱动的C#开发...

    Spring中事务的传播属性详解

    #### 五、总结 通过上述分析,我们可以看出Spring中的事务传播行为提供了丰富的选项,可以帮助开发者精确地控制事务的执行逻辑。正确理解和运用这些传播行为对于实现健壮、高效的事务管理至关重要。在实际开发中,...

    分布式事务与Seata开发总结.pdf

    1、详细介绍了Seata阿里分布式事务中间件; 2、对整个分布式事务解决方案原理进行了详细的分析,包括tcc、xa、saga等解决方案 3、IT老齐老师视频资料配套pdf;

    分布式事务专题总结.pdf

    在理解分布式事务专题之前,首先需要明确事务的基本概念。事务是一种机制,它保证了数据库操作的原子性、一致性、隔离性和持久性,也就是我们熟知的ACID属性。原子性(Atomicity)意味着事务中的所有操作要么全部...

    Python sqlite3事务处理方法实例分析

    sqlite3事务总结: 在connect()中不传入 isolation_level 事务处理: 使用connection.commit() #!/usr/bin/env python # -*- coding:utf-8 -*- '''sqlite3事务总结: 在connect()中不传入 isolation_level 事务处理: ...

Global site tag (gtag.js) - Google Analytics