zoukankan      html  css  js  c++  java
  • 浅谈spring 声明式事物

    此处主要讲讲事物的属性。

    事物属性包含了五个方面:

    1.传播行为

    2.隔离规则

    3.回滚规则

    4.事物超时

    5.是否只读

    一.传播行为

    事务的第一个方面是传播行为(propagation behavior)。当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。spring定义了七种传播行为。

    1.1  PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

    1.2 PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。

    1.3 PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。

    1.4 PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。

    1.5 PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

    1.6 PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。

    1.7 PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

    列:

    数据库中有表smts_user_device_info_tmp,字段:USER_ID,DEVICE_TYPE,DEVICE_ID默认都是1.

    dao中有三个方法,test1():用来更新user_id=2,test2():用来更新DEVICE_TYPE=2,test3():用来更新DEVICE_ID=2

    1.service方法如下:

    @Component("testService")
    public class TestServiceImpl implements TestService {
    	@Autowired
    	private AnnuityApplicationDao annuityApplicationDao;
    	@Autowired
    	private Test2Service test2Service;
    
    	@Override
    	@Transactional(propagation= Propagation.REQUIRED)
    	public void fun1() throws Exception {
    		annuityApplicationDao.test1();
    		int i = 1/0;
    		annuityApplicationDao.test2();
    	}
    
    	public void fun2() throws Exception{
    		annuityApplicationDao.test3();
    		fun1();
    	}
    	
    }
    

    若执行fun1()方法,结果如下:事物回滚

    若执行fun2()方法,结果如下:

    发现事物没起作用,原因可参照:http://blog.csdn.net/seelye/article/details/40144817

    若fun1(),fun2()不是在一个类内,会发现事物是起作用的。

    在fun2()上注解事物,调用fun2(),环境中没有事物,会新建一个事物,当在fun2中调用fun1时,环境中已经有了事物,则fun1加入当前事物。

    2.service方法如下:

    @Component("testService")
    public class TestServiceImpl implements TestService {
    	@Autowired
    	private AnnuityApplicationDao annuityApplicationDao;
    	@Autowired
    	private Test2Service test2Service;
    
    	@Override
    	@Transactional(propagation= Propagation.SUPPORTS)
    	public void fun1() throws Exception {
    		annuityApplicationDao.test1();
    		int i = 1/0;
    		annuityApplicationDao.test2();
    	}
    
    	@Transactional(propagation = Propagation.REQUIRED)
    	public void fun2() throws Exception{
    		annuityApplicationDao.test3();
    		fun1();
    	}
    	
    }
    

    单独调用fun1,事物没有执行,当调用fun2,fun1加入了fun2的事物执行。

    3. service如下:

    @Component("testService")
    public class TestServiceImpl implements TestService {
    	@Autowired
    	private AnnuityApplicationDao annuityApplicationDao;
    	@Autowired
    	private Test2Service test2Service;
    
    	@Override
    	@Transactional(propagation= Propagation.MANDATORY)
    	public void fun1() throws Exception {
    		annuityApplicationDao.test1();
    		annuityApplicationDao.test2();
    	}
    
    	@Transactional(propagation = Propagation.REQUIRED)
    	public void fun2() throws Exception{
    		annuityApplicationDao.test3();
    		fun1();
    	}
    	
    }
    

      当单独调用fun1,因为当前没有事物,所以抛出异常,当执行fun2,fun1加入fun2当前事物执行。

  • 相关阅读:
    第十讲:网络虚拟化(二)
    第九讲:网络虚拟化(一)
    第十二讲:存储虚拟化(二)
    第十一讲:存储虚拟化(一)
    第八讲:I/O虚拟化
    第七讲:内存虚拟化
    第六讲:CPU虚拟化
    node to traverse cannot be null!
    利用 squid 反向代理提高网站性能(转载)
    Servlet自动加载
  • 原文地址:https://www.cnblogs.com/gexiaoshan/p/6027096.html
Copyright © 2011-2022 走看看