Spring事务管理例子

这些天我看了一下《Spring FrameWork开发手册》这个技术文档,我翻阅了里面事务管理,现在在这里写下来,以后翻阅的时候可以复习一下:

个人认为Spring框架主要在于它的IOC和AOP以及事务管理,这里有时间再去介绍IOC和AOP,在Spring中事务管理可以有两种方式来进行:

1、声明式事务管理(基于注解)

2、编程式事务管理(基于xml)


大多时候都应该选择声明式事务管理,这对我们的业务代码影响最小,符合非入侵式编程。

一、声明式事务管理

Spring的声明式事务管理是通过SpringAOP实现的,Spring的声明式事务管理可以被应用到任何类(以及那个类的实例上),Spring提供了声明式的回滚规则,Spring允许你通过AOP定制事务行为。在理解Spring的声明式事务管理方面最重要的概念是:Spring事务管理是通过AOP实现的,其中的事务通知由元数据(目前基于XML或注解)驱动,代理对象与事务元数据结合产生了一个AOP代理,它使用一个PlatFormTransactionManager实现配合TranSactionInterceptor,在方法调用前后实施事务。

案例:

用maven创建一个项目名为transactionalAnnotation的项目,这里就简单的写一下:

pom.xml:


  4.0.0
  com.ry
  transactionalAnnotation
  war
  0.0.1-SNAPSHOT
  transactionalAnnotation Maven Webapp
  http://maven.apache.org
  
  
	4.2.4.RELEASE
  
  
  
    
      junit
      junit
      3.8.1
      test
    
    
    
    
        org.springframework
        spring-core
        ${springframework}
    
    
    
        org.springframework
        spring-beans
        ${springframework}
    
    
    
        org.springframework
        spring-web
        ${springframework}
    
    
    
        org.springframework
        spring-webmvc
        ${springframework}
    
    
    
	    org.springframework
	    spring-aop
	    ${springframework}
	
    
    
	    org.springframework
	    spring-tx
	    ${springframework}
	
	
	
        org.springframework
        spring-orm
        ${springframework}
    
	
	
	    org.springframework
	    spring-jdbc
	    ${springframework}
	
	
	
	
	    junit
	    junit
	    4.11
	    test
	
	
	
	
	
	    cglib
	    cglib
	    2.2.2
	
	
	
	
	    org.aspectj
	    aspectjrt
	    1.8.10
	
	
	
	    aopalliance
	    aopalliance
	    1.0
	
	
	
        org.aspectj
        aspectjweaver
        1.8.8
       
    
    
        
	
		c3p0
		c3p0
		0.9.1.2
	 
	
	
	  
        mysql  
        mysql-connector-java  
        5.1.30  
     
  
  
  
    transactionalAnnotation
  
在resource里面创建数据库配置文件jdbc.properties:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/ssm
jdbc.username=root
jdbc.password=root
接着创建spring-application.xml:


	
	
	
	
	
	
	
	
    
    
		
		
		
		
		

		
		
		
		
		
		
		
		
		
	
    
    
  		
  	
    
	
	

当然web.xml也必须配置


  Archetype Created Web Application
  
  
  	springmvc
  	org.springframework.web.servlet.DispatcherServlet
  	
  	
  		contextConfigLocation
  		classpath:spring-*.xml
  	
  	1
  
  
  
  	springmvc
  	/
  
  

创建StudentService.java:

public interface StudentService{
	//基本业务  这里就不给参数了
	public void addStu();
	
	public void updateStu();
	
	public List selectStu();
	
	public int deleteStu();
}

创建StudentServiceImpl.java:

@Transactional
public class StudentServiceImpl  implements StudentService {
	// 事务:完成多个操作,只要一个中断或退出,其他操作的结果就不会被确认。即:一个整体性的操作
	//为了测试事务  在这里抛出异常,阻止事务的继续进行
	
	@Override
	public void addStu() {
		throw new NullPointerException();
	}

	@Override
	public void updateStu() {
		throw new NullPointerException();
	}

	@Override
	public List selectStu() {
		throw new NullPointerException();
		//这里 抛出异常后  不要再加return了,不然会报错,不能通过编译
	}

	@Override
	public int deleteStu() {
		throw new NullPointerException();
	}
	
}
接下来写一个测试:
public class TransactionTest {
	
	@org.junit.Test
	public void Test(){
		ApplicationContext ac = new FileSystemXmlApplicationContext("classpath:spring-application.xml"); 
		StudentService stu =(StudentService) ac.getBean("studentService");  
		stu.selectStu();
	}
}
结果是会报空指针异常,当然如果你在ServiceImpl里面添加业务方法,由于空指针异常,这时事务会发生回滚。


二、编程式事务管理

编程式事务管理是基于xml的形式,与AOP一起结合使用,下面看一下实例:

使用maven创建项目transactional,maven的pom.xml配置以及其他的配置同上,主要是spring-application.xml里面的内容不同:



	
	
	
	
	
	
		
			
			
			
			
		
	
	
	
	
		
		
	
	
	
    
    
		
		
		
		
		

		
		
		
		
		
		
		
		
		
	
    
    
  		
  	
    
	
	
这种是基于xml的配置。实际上在开发过程中会更加复杂,这里只是简单的介绍一下如何配置。

你可能感兴趣的:(Spring)