spring 事物管理

1 在spring中支持编程式事物和声明式事务管理,通常使用声明式事物管理,声明式的事物管理是基于aop机制实现的使用很方便。

2 spring支持单一数据库资源的事物管理和跨越多个数据库资源的事物管理既JTA全局事物。

3 在spring中提供了多个事物管理类,常用的是;DataSourceTransactionManager,HibernateTransactionManager和JtaTransactionManager。

DataSourceTransactionManager :数据源事物管理器,用于JDBC框架和MyBatis的事物管理。

HibernateTransactionManager: hibernate事物管理器,用于hibernate事物管理。

JtaTransactionManager:分布式事物管理,把事物管理委托给JAVAEE服务器事物管理器。

4 HibernateTransactionManager加注解的形式进行事物管理:

dao层为日志dao的接口加实现和用户接口加实现,:

package com.dao;

import com.entity.Slog;

public interface LogDao {
	public void save(Slog log);
}
package com.dao;

import javax.annotation.Resource;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.stereotype.Repository;

import com.entity.Slog;
@Repository(value="logDao")
public class LogDaoImpl implements LogDao {
private SessionFactory sessionFactory;

	public SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	@Resource
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}
	@Override
	public void save(Slog log) {
		try {
			Session session=sessionFactory.getCurrentSession();
			session.save(log);
			System.out.println("log:ok");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

package com.dao;

import com.entity.Student;

public interface UserDao {
	public void save(Student student);
}
package com.dao;

import javax.annotation.Resource;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.stereotype.Repository;

import com.entity.Student;
@Repository(value="userDao")
public class UserDaoImpl implements UserDao{
	private SessionFactory sessionFactory;

	public SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	@Resource
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	public void save(Student student){
		try {
			Session session=sessionFactory.getCurrentSession();

			session.save(student);		

			System.out.println("student:ok");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

service层,用户的service接口加实现:

package com.service;

import com.entity.Student;

public interface UserService {
	public void save(Student student);
}
package com.service;

import java.util.Date;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.dao.LogDao;
import com.dao.UserDao;
import com.entity.Slog;
import com.entity.Student;
@Service(value="userService")
public class UserServiceImpl implements UserService{
	private UserDao userDao;
	private LogDao logDao;

	public LogDao getLogDao() {
		return logDao;
	}
	@Resource
	public void setLogDao(LogDao logDao) {
		this.logDao = logDao;
	}
	public UserDao getUserDao() {
		return userDao;
	}
	@Resource
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
	@Transactional(propagation=Propagation.REQUIRED)
	@Override
	public void save(Student student) {
		userDao.save(student);
		Slog sl=new Slog();
		sl.setLogDate(new Date());
		logDao.save(sl);

	}
}

实体类:

package com.entity;

import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Slog {
	@Id
	@GeneratedValue
	private Integer logId;
	private Date logDate;
	public Integer getLogId() {
		return logId;
	}
	public void setLogId(Integer logId) {
		this.logId = logId;
	}
	public Date getLogDate() {
		return logDate;
	}
	public void setLogDate(Date logDate) {
		this.logDate = logDate;
	}

}
package com.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Student {
	@Id
	@GeneratedValue
	private Integer studentId;
	private String studentName;
	public Integer getStudentId() {
		return studentId;
	}
	public void setStudentId(Integer studentId) {
		this.studentId = studentId;
	}
	public String getStudentName() {
		return studentName;
	}
	public void setStudentName(String studentName) {
		this.studentName = studentName;
	}

}

applicationContext.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:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
		 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
		http://www.springframework.org/schema/aop
		http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
		http://www.springframework.org/schema/tx
	    http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
		http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-2.5.xsd">
	<context:component-scan base-package="com.*" />
	<context:annotation-config />
	<tx:annotation-driven transaction-manager="txManager"/>
	<bean
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<value>classpath:c3p0.properties</value>
		</property>
	</bean>
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="${driverClass}"></property>
		<property name="jdbcUrl" value="${jdbcUrl}"></property>
		<property name="user" value="${user}"></property>
		<property name="password" value="${password}"></property>
	</bean>

	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
		<property name="annotatedClasses">
			<list>
				<value>com.entity.Student</value>
				<value>com.entity.Slog</value>
			</list>
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.hbm2ddl.auto">update</prop>
			</props>
		</property>

	</bean>
	<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
 		 <property name="sessionFactory" ref="sessionFactory" />
	</bean>
</beans>

测试类:

package com.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.entity.Student;
import com.service.UserService;

public class Test {

	public static void main(String[] args) {
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
		UserService uc=(UserService) ac.getBean("userService");
		Student s=new Student();
		s.setStudentName("hh");
		uc.save(s);

	}

}

5 在dao里获取session的时候,这里需要sessionFactory.getCurrentSession(),要使用上下文里的同一个session;

6 @Transactional,放在哪个方法之上对哪个方法加事物,放在类的上面,对所有方法加事物。

7 @Transactionnal(propagation=Propagation.REQUIRED)里面可以设置事物的属性:

propagation指定事物的传播特性,7个传播特性如下:

1 Propagation.REQUIRED 如果当前环境存在一个事物,则加入当前事物,不存在,则开启一个新的事物。这是默认的特性,也是经常用的。

2 Propagation.SUPPORTS 如果当前环境存在一个事物,则加入当前事物,不存在,则以非事物方式运行。

3 Propagation.REQUIRES_NEW 如果当前环境存在一个事物,让当前的事物挂起(暂停执行),自己再开启一个新的事物,当新的事物执行完毕,原来的事物才会继续执行。如果当前环境不存在事物,同样也是自己开启一个新的事物。

4 Propagation.NOT_SUPPORTED 如果当前环境存在一个事物,让当前事物挂起,自己非事物方式运行,当自己执行完毕,之前的事物继续执行。如果当前环境不存在事物,自己同样直接非事物方式运行。

5 Propagation.NEVER 绝对不能在事物范围内执行,入果在某个事物范围内执行,容器会抛出异常。只有没有关联到事物才会正常执行。

6 Propagation.NESTED 如果当前环境存在一个事物,运行在这个嵌套的事物中,如果当前没有事物就新建一个事物。与父事物相互独立,这个事物有多个回滚的保证点,自己事物的回滚不会对外部事物造成影响。只对DataSourceTransactionManager事物管理器起作用。

7 Propagation.MANDATORY 当前的方法必须加入当前的事物,如果当前不存在事物则抛出异常。

8 @Transactionnal(readOnly=true)设置只读,只是用于查询,会创建只读的connection,这样可以提高查询效率。

9 @Transactional(timeout=50) 事物超时时间,以秒为单位。

10 @Transactional() 通过 isolation 指定事物的隔离级别。

11 @Transactional()只能用于public 修饰的方法上,非public方法将会使得事物失效。

12 通过xml配置事物:

1 配置事物管理器

2 设置事物管理器属性

3 将设置好的属性通过aop切入对应service层

applicationContext.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:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
		 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
		http://www.springframework.org/schema/aop
		http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
		http://www.springframework.org/schema/tx
	    http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
		http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-2.5.xsd">
	<context:component-scan base-package="com.*" />
	<context:annotation-config />
	<!-- <tx:annotation-driven transaction-manager="txManager"/> -->
	<bean
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<value>classpath:c3p0.properties</value>
		</property>
	</bean>
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="${driverClass}"></property>
		<property name="jdbcUrl" value="${jdbcUrl}"></property>
		<property name="user" value="${user}"></property>
		<property name="password" value="${password}"></property>
	</bean>

	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
		<property name="annotatedClasses">
			<list>
				<value>com.entity.Student</value>
				<value>com.entity.Slog</value>
			</list>
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.hbm2ddl.auto">update</prop>
			</props>
		</property>

	</bean>

	<bean id="txManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>
	<tx:advice id="txAdvice" transaction-manager="txManager">
		<tx:attributes>
			<tx:method name="get*" read-only="true" />
			<tx:method name="save*" propagation="REQUIRED"/>
		</tx:attributes>
	</tx:advice>
  <aop:config>
  	<aop:pointcut id="fooServiceOperation" expression="execution(public * com.service..*.save(..))"/>
  	<aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation"/>
  </aop:config>
</beans>



时间: 2024-10-25 01:53:50

spring 事物管理的相关文章

MyBatis6:MyBatis集成Spring事物管理(下篇)

前言 前一篇文章<MyBatis5:MyBatis集成Spring事物管理(上篇)>复习了MyBatis的基本使用以及使用Spring管理MyBatis的事物的做法,本文的目的是在这个的基础上稍微做一点点的进阶:多数据的事物处理.文章内容主要包含两方面: 1.单表多数据的事物处理 2.多库/多表多数据的事物处理 这两种都是企业级开发中常见的需求,有一定的类似,在处理的方法与技巧上又各有不同,在进入文章前,先做一些准备工作,因为后面会用到多表的插入事物管理,前面的文章建立了一个Student相关

spring 事物管理特性

采用编程式事务1. getCurrentSession()与openSession()的区别? * 采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession()创建的session则不会 * 采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession创建的session必须手动关闭 2.使用getCurrentSession()需要在hibernate.cfg.xm

Spring事物管理简介 (转)

一.事物1.什么是事物 事物指的是逻辑上的一组操作,这组操作要么全部成功,要么全部失败 2.事物的特性 原子性:事物是一个不可分割的工作单位,事物中的操作要么都发生,要么都不发生 一致性:事物前后数据的完整性必须保持一致 隔离性:指多个用户并发访问数据库时,一个用户的事物不能被其他用户的事物所干扰,多个并发事物之间数据要相互隔离. 持久性:一个事物一旦被提交,它对数据库中数据的改变就是永久性的,即使数据库发生故障也不应该对其有任何影响. 二.事物的API介绍 Spring事物管理高层抽象主要包括

spring事物管理--声明式(AspectJ)(推荐使用)

1.表结构及数据 2.需引入的jar包: 3.业务层(Service).持久层(Dao)接口与实现类 Service接口: //转账案例业务层接口 public interface AccountService { /** * @param out :转出账号 * @param in :转入账号 * @param money :转账金额 */ public void transfer(String out,String in,Double money); } Service实现类: //转账案例

集成Spring事物管理

单独使用MyBatis对事物进行管理 前面MyBatis的文章有写过相关内容,这里继续写一个最简单的Demo,算是复习一下之前MyBatis的内容吧,先是建表,建立一个简单的Student表: create table student ( student_id int auto_increment, student_name varchar(20) not null, primary key(student_id) ) 建立实体类Student.java: public class Studen

Spring入门第4天--Spring事物管理

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.06.24 lutianfei none 事务 事务:是逻辑上一组操作,要么全都成功,要么全都失败. 事务特性:ACID 原子性:事务不可分割 一致性:事务执行的前后,数据完整性保持一致. 隔离性:一个事务执行的时候,不应该受到其他事务的打扰 持久性:一旦结束,数据就永久的保存到数据库. 如果不考虑隔离性: 脏读:一个事务读到另一个事务未提交数据 不可重复读:一个事务读到另一个事务已经提交数据(update)导致一个事

spring事物管理--声明式(AspectJ)注解实现 (推荐使用)

1.表结构及数据 2.使用的jar包 3.service.Dao层接口与实现类: Dao接口: //转账案例持久层接口 public interface AccountDao { /** * @param out :转出账号 * @param money :转账金额 */ public void outMoney(String out,Double money); /** * @param in :转入账号 * @param money :转账金额 */ public void inMoney(

spring事物管理

一)spring的事务管理     事务管理并非spring独有,用过JDBC hibernate的朋友都知道,这些api和框架都提供了自己的事务管理机制.那么spring的事务管理又有些什么与众不同支持呢?它的优点又有哪些呢?总结来说大概有以下这么几点: 1' 为不同的事务API提供一致的编程模型,如Java Transaction API (JTA).JDBC.Hibernate.JavaPersistenceAPI(JPA)以及JavaDataObjects(JDO) 2' 支持decla

MyBatis5:MyBatis集成Spring事物管理(上篇)

前言 有些日子没写博客了,主要原因一个是工作,另一个就是健身,因为我们不仅需要努力工作,也需要有健康的身体嘛. 那有看LZ博客的网友朋友们放心,LZ博客还是会继续保持更新,只是最近两三个月LZ写博客相对会慢一些,博客的内容也会更偏向于实战一些,主要是对于工作中遇到一些比较实际性的问题进行总结与研究,并整理成文与网友朋友们分享. 灵感来源于生活,灵感也来源于工作,今天LZ博文的内容就是MyBatis与Spring事物集成的问题,后面的文章写作宗旨就是尽量写得详细点,把东西能给网友朋友们说清楚,OK