数据库的七种传播方式

其实数据库的七种传播行为在网上查询了一下,和Spring中使用到的7种事务传播行为是没什么差别的,因为我写的博文基本和JAVA有相关,所以就结合Spring中事务传播和例子来讲一下咯。

事务传播行为如下:

Require:支持当前事务,如果没有事务,就建一个新的,这是最常见的;

Requires_New:新建事务,如果当前存在事务,把当前事务挂起;

Supports:支持当前事务,如果当前没有事务,就以非事务方式执行;

Not_Supported:以非事务方式执行操作,如果当前存在事务,就把事务挂起;

Mandatory:支持当前事务,如果当前没有事务,就抛出异常;

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

Nested:新建事务,如果当前存在事务,把当前事务挂起。与Require_New的区别是与父事务相关,且有一个savepoint。即则在嵌套事务内执行。

其中,Require、Supports、NotSupported、Never两个看文字也就能了解,就不多说了。而Mandatory是要求所有的操作必须在一个事务里,较Require来说,对事务要求的更加严格。

RequireNew:当一个Require方法A调用RequireNew方法B时,B方法会新new一个事务,并且这个事务和A事务没有关系,也就是说B方法出现异常,不会导致A的回滚,同理当B已提交,A再出现异常,B也不会回滚。

Nested:这个和RequireNew的区别是B方法的事务和A方法的事务是相关的。只有在A事务提交的时候,B事务都会提交。也就是说当A发生异常时,A、B事务都回滚,而当B出现异常时,B回滚,而A回滚到savepoint,如下代码所示:

publicvoid A(){

    //操作1

    //操作2

    //操作3

    try{

        //savepoint

        B();//一个Nested的方法

    } catch{

        //出现异常,B方法回滚,A方法回滚到savepoint,也就是说操作1、2、3 都还在

       C();

    } finally{

    }

}  

 

使用步骤:

步骤一、在spring配置文件中引入<tx:>命名空间

<beansxmlns="http://www.springframework.org/schema/beans"

 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 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/tx

 http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

 

步骤二、具有@Transactional 注解的bean自动配置为声明式事务支持 

<!-- 事务管理器配置, Hibernate单数据源事务 -->

<bean id="defaultTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<property name="sessionFactory" ref="sessionFactory"/>

</bean>

<!-- 使用annotation定义事务-->

<tx:annotation-driventransaction-manager="defaultTransactionManager" proxy-target-class="true"/>

 

步骤三、在接口或类的声明处 ,写一个@Transactional。要是只在接口上写, 接口的实现类就会继承下来、接口的实现类的具体方法,可以覆盖类声明处的设置

@Transactional   //类级的注解、适用于类中所有的public方法。

 

事务的传播行为和隔离级别

大家在使用spring的注解式事务管理时,对事务的传播行为和隔离级别可能有点不知所措,下边就详细的介绍下以备方便查阅。

事物注解方式: @Transactional

当标于类前时, 标示类中所有方法都进行事物处理 , 例子:

@Transactional

public classTestServiceBean implements TestService {}

当类中某些方法不需要事物时:

@Transactional

public classTestServiceBean implements TestService {

private TestDao dao; publicvoid setDao(TestDao dao) { this.dao = dao; }

@Transactional(propagation =Propagation.NOT_SUPPORTED)

publicList<Object> getAll() { return null; } }

 

事物传播行为介绍: 

@Transactional(propagation=Propagation.REQUIRED) 

如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)

@Transactional(propagation=Propagation.NOT_SUPPORTED) 

容器不为这个方法开启事务

@Transactional(propagation=Propagation.REQUIRES_NEW) 

不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务

@Transactional(propagation=Propagation.MANDATORY) 

必须在一个已有的事务中执行,否则抛出异常

@Transactional(propagation=Propagation.NEVER) 

必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)

@Transactional(propagation=Propagation.SUPPORTS) 

如果其他bean调用这个方法,在其他bean中声明事务,那就用事务。如果其他bean没有声明事务,那就不用事务.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值