`
liuluo129
  • 浏览: 115017 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring 编程式事务管理

阅读更多

Spring提供两种方式的编程式事务管理:

  • 使用 TransactionTemplate

  • 直接使用一个 PlatformTransactionManager 实现

 

如果你选择编程式事务管理,Spring推荐使用 TransactionTemplate

使用TransactionTemplate

 

TransactionTemplate 采用与Spring中别的 模板 同样的方法, 如 JdbcTemplate 。它使用回调机制,将应用代码从样板式的资源获取和释放代码中解放出来, 这样写出的代码是目的驱动的,把精力集中在开发者想要做的事情上。

应用的代码必须在一个事务性的上下文中执行,这样就会像这样一样显式的使用TransactionTemplate。你作为一个应用程序员, 会写一个 TransactionCallback 或TransactionCallbackWithoutResult的实现, (通常会用匿名类来实现 )这样的实现会包含所以你需要在该事务上下文中执行的代码。 然后你会把一个你自己实现TransactionCallback或TransactionCallbackWithoutResult的实例传递给TransactionTemplate暴露的execute(..) 方法。

public class PointPayService implements IPayService {

    private final TransactionTemplate transactionTemplate;

    public PointPayService(PlatformTransactionManager platformTransactionManager) {
        Assert.notNull(platformTransactionManager, "The 'PlatFormTransactionManager' arguement must not be null!");
        transactionTemplate = new TransactionTemplate(platformTransactionManager);
        transactionTemplate.setTimeout(30);
        transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_REPEATABLE_READ);
    }

    @Override
    public String pay(final long userId, final long money) {
        return transactionTemplate.execute(new TransactionCallback<String>() {
            @Override
            public String doInTransaction(TransactionStatus transactionStatus) {
                System.out.println("用户:" + userId + "使用积分支付金额:" + money);
                return "ok";
            }
        });
    }
    
    private void transactionWithoutReturn() {
        // 不需要返回值时使用TransactionCallbackWithoutResult
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
                try {
                    operation1();
                    operation2();
                } catch (Exception e) {
                    // 抛出异常时进行回滚
                    transactionStatus.setRollbackOnly();
                }
            }
    
            private void operation1() {
    
            }
    
            private void operation2() {
    
            }
        });
    }
}

使用Spring XML配置来定制TransactionTemplate的事务属性。 'TransactionTemplate'可以被注入到所有需要的服务中去。

<bean id="sharedTransactionTemplate"
    class="org.springframework.transaction.support.TransactionTemplate">
  <property name="isolationLevelName" value="ISOLATION_READ_UNCOMMITTED"/>
  <property name="timeout" value="30"/>
</bean>"

 最后,TransactionTemplate 类的实例是线程安全的,任何状态都不会被保存。 TransactionTemplate 实例 的确会 维护配置状态,所以当一些类选择共享一个单独的 TransactionTemplate实例时, 如果一个类需要使用不同配置的TransactionTemplate(比如,不同的隔离等级), 那就需要创建和使用两个不同的TransactionTemplate。 

 

使用PlatformTransactionManager

也可以使用 org.springframework.transaction.PlatformTransactionManager 来直接管理你的事务。只需通过bean的引用,简单的把你在使用的PlatformTransactionManager 传递给你的bean。 然后,使用TransactionDefinitionTransactionStatus对象, 你可以启动,回滚和提交事务。

DefaultTransactionDefinition def = new DefaultTransactionDefinition();
// 设置事务名称
def.setName("SomeTxName");
// 设置事务传播行为
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

TransactionStatus status = txManager.getTransaction(def);
try {
    // execute your business logic here
}
catch (Exception ex) {
    txManager.rollback(status);
    throw ex;
}
txManager.commit(status);

 一般情况下我们使用声明式事务方式,在有特殊情况下要使用编程式事务时,推荐使用TransactionTemplate方式

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics