Spring的事物传播行为

事物的传播属性:
当事务方法被另一个事务方法调用时, 必须指定事务应该如何传播. 例如: 方法可能继续在现有事务中运行(REQUIRED), 也可能开启一个新事务, 并在自己的事务中运行(Required_NEW).
事务的传播行为可以由传播属性(propagation)指定. Spring 定义了 7 种类传播行为.

这里主要理解一下REQUIRED和REQUIRED_NEW

用例子来说明:
比如一个客户去买两本书,但是账户的余额只能买一本书,那这时应该怎么处理呢?处理方法就是:1要么买一本书,2要么两本一起不买
代码说明:
客户买多本书的接口:

package com.jeremy.springTransaction;
import java.util.List;
public interface cashier {
    void checkOut(String userName,List<String> isbns);
}

实现类:

package com.jeremy.springTransaction;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class cashierImpl implements cashier {
    @Autowired
    BookShopServiceImpl bookShopServiceImpl;

    @Transactional
    @Override
    public void checkOut(String userName, List<String> isbns) {
        // TODO Auto-generated method stub
        for (String isbn:isbns) {
            bookShopServiceImpl.purchase(userName, isbn);
        }
    }
}

purchase()方法代码:

@Autowired
    private BookShopDao bookShopDao;

    @Transactional
    @Override
    public void purchase(String username, String isbn) {

        //1. 获取书的单价
        int price = bookShopDao.findBookPriceByIsbn(isbn);

        //2. 更新数的库存
        bookShopDao.updateBookStock(isbn);

        //3. 更新用户余额
        bookShopDao.updateUserAccount(username, price);
    }

完整代码这里下载:

这里只是举例子
当客户需要买两本书时,就需要调用checkout()方法,并启动事务(tx1),但是checkout()方法又需要调用purchase()方法,而这个方法也有事务(tx2),这时tx2是要重新开启一个事务还是放在tx1事务中运行

当放在事务tx1运行时:也就是事务的传播属性(propagation=REQUIRED)时,运行流程如下:
REQUIRED:在现有的事务内运行,一起提交

所以这时客户一本书也买不了,因为事务tx2、tx3都和事务tx1一起提交

当重新开启一个事务时:也就是事务的传播属性(propagation=REQUIRED_NEW)时,运行流程如下:

EQUIRES_NEW. 它表示该方法必须启动一个新事务, 并在自己的事务内运行. 如果有事务在运行, 就应该先挂起它.

所以这时客户能买一本书,因为事务tx2已经提交了,

时间: 2024-10-05 17:01:34

Spring的事物传播行为的相关文章

spring事物的七种事物传播属性行为及五种隔离级别

首先,说说什么事务(Transaction). 事务,就是一组操作数据库的动作集合.事务是现代数据库理论中的核心概念之一.如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务.当所有的步骤像一个操作一样被完整地执行,我们称该事务被提交.由于其中的一部分或多步执行失败,导致没有步骤被提交,则事务必须回滚到最初的系统状态. 其中spring七个事物传播属性: PROPAGATION_REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务.这是最常见的选择. PR

关于spring 事物传播性的研究

spring的一大特色就是数据库事务管理方便,我们在代码中编写代码时,看不到事务的使用,关键是spring 使用了AOP进行事务拦截.   这篇文章主要介绍spring的事务传播性.   1.为什么要介绍这个: 介绍一下使用场景: 在系统中我们使用了一个流水号,这个功能实现如下: 1.先使用for update 进行行锁. select * from sys_identity t where alias='REQUESTID' for update; 这个时候锁是不会释放的. 2.使用更新语句更

spring事物传播机制与隔离级别

转载自:http://www.blogjava.net/freeman1984/archive/2010/04/28/319595.html7个传播行为,4个隔离级别, Spring事务的传播行为和隔离级别[transaction behavior and isolated level]2007-08-01 16:33事务的传播行为和隔离级别[transaction behavior and isolated level] Spring中事务的定义:一.Propagation : key属性确定

[原创]java WEB学习笔记109:Spring学习---spring中事物管理

博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ------------------------------------------------------------------------------------------------------------------

由openSession、getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持

由openSession.getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持 Spring和Hibernate的集成的一个要点就是对事务的支持,openSession.getCurrentSession都是编程式事务(手动设置事务的提交.回滚)中重要的对象,HibernateDaoSupport则提供了更方便的声明式事务支持. Hibernate中最重要的就是Session对象的引入,它是对jdbc的深度封装,包括对事务的处理,Session对

事物传播属性

大部分时候,我们都习惯了spring容器默认的配置,但有时候,我们需要知道更多…… 当使用声明式事务模型时,您必须告诉容器如何去管理事务,例如,何时开启一个事务?哪些方法需要事务?当前不存在事务的情况下,容器是否需要为其添加事务控制?事实上,Spring提供了一个bean ——TransactionAttributSource,通过配置其事务(传播)属性(transactionattribute)来达到精确控制事务行为的目的.事务的属性总共有六种: Required    Mandato   

解惑spring嵌套事物

工作中一直对spring中的事物管理都是最简单的配置 但是spring中的事物传播性配置 还有很多种,有时候经常疑惑service调用service的问题,今天的论坛上看到一篇写的非常详细的文字.记录下来.猛击下面的链接地址 http://feiing.iteye.com/blog/35907 对于事物的其他知识请阅读这篇文章 http://my.oschina.net/huangyong/blog/160012

Spring事务之传播机制

Spring事务传播机制:Spring在TransactionDefinition接口中规定了种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套时事务如何进行传播.即协调已经有事务标识的方法之间的发生调用时的事务上下文的规则(是否要有独立的事务隔离级别和锁). 事务的嵌套概念:所谓事务的嵌套就是两个事务方法之间相互调用.Spring事务开启,或者是基于接口的,或者是基于类的代理被创建(注意一定要是代理,不能手动new一个对象,并且此类(有无接口都行)一定要被代理----Spring中的b

Spring的事物原理

在Spring中把非功能性的事物管理代码以切面的形式进行管理,只需要声明事物即可启用事物管理. 本质:最终执行的还是java.sql.Connection的setAutoCommit(),commit(),rollback()方法. 事物管理器接口:PlatformTransactionManager.java package org.springframework.transaction; public interface PlatformTransactionManager { Transa