欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring事务管理

程序员文章站 2022-05-23 14:57:48
...
最近研究了spring的事务管理,在网上借鉴了很多blog,一一实践后,我把我的实践成果贴出来大家分享,感谢那些对我有帮助的blog的主人。

SPRING的两种事务管理方式:编程式、声明式。通常建议采用声明式事务管理。声明式事务管理的优势非常明显:代码中无需关于关注事务逻辑,让Spring声明式事务管理负责事务逻辑,声明式事务管理无需与具体的事务逻辑耦合,可以方便地在不同事务逻辑之间切换。
一、
Spring事务策略
  Spring事务策略,也就是spring事务管理的实现方式.它有一个统一的抽象接口:  org.springframework.transaction.PlatformTransactionManager
  此接口的内容如下:
 
 Public interface PlatformTransactionManager()...{
  TransactionStatue getTransaction(TransactionDefinition definition) throws TransactionException;
  Void commit(TransactionStatus status) throws TransactionException;
  Void rollback(TransactionStatus status) throws TransactionException;
  }

1、getTransaction(..)方法根据一个类型为 TransactionDefinition 的参数返回一个 TransactionStatus 对象。返回的 TransactionStatus 对象可能代表一个新的或已经存在的事务(如果在当前调用堆栈有一个符合条件的事务,否则开启一个新的事务)。
TransactionStatus 接口为处理事务的代码提供一个简单的控制事务执行和查询事务状态的方法。这个概念应该是熟悉的,因为它们在所有的事务API中是相同的:
public interface TransactionStatus {
boolean isNewTransaction();
void setRollbackOnly();
boolean isRollbackOnly();
}

2、TransactionDefinition接口指定:
事务隔离:当前事务和其它事务的隔离的程度。
例如,这个事务能否看到其他事务未提交的写数据?
事务传播:通常在一个事务中执行的所有代码都会在这个事务中运行。但是,如果一个事务上下文已经存在,有几个选项可以指定一个事务性方法的执行行为:例如,简单地在现有的事务中继续运行(大多数情况);或者挂起现有事务,创建一个新的事务。Spring提供EJB CMT中常见的事务传播选项。
事务超时: 事务在超时前能运行多久(自动被底层的事务基础设施回滚)。
只读状态: 只读事务不修改任何数据。只读事务在某些情况下(例如当使用Hibernate时),是一种非常有用的。

二、编程式事务管理
TransactionTemplate 采用与Spring中别的 模板 同样的方法, 如 JdbcTemplate 。它使用回调机制,将应用代码从样板式的资源获取和释放代码中解放出来, 这样写出的代码是目的驱动的,把精力集中在开发者想要做的事情上。
TransactionCallbackWithoutResult —— 执行事务没有返回值,例如save、update、delete等等;
TransactionCallback —— 执行事务处理后有返回值,如find要返回结果集(List);
使用 TransactionTemplate 绝对会增加你的代码与Spring的事务框架和API间的耦合。 到底编程式事务管理是不是适合你的项目需要由你自己来决定。
应用的代码必须在一个事务性的上下文中执行。你作为一个应用程序员, 会写一个 TransactionCallback 的实现, (通常会用匿名类来实现 )这样的实现会包含所以你需要在该事务上下文中执行的代码。 然后你会把自己实现TransactionCallback的实例传递给TransactionTemplate暴露的execute(..) 方法。


编程式事务管理代码
public void updateUser(final UserInfo userData ) {
transactionTemplate
.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
try {
entityDao.merge(userData);
} catch (Exception e) {
e.printStackTrace();
status.setRollbackOnly();
}
}
});
}



编程式事务管理
指定事务设置
诸如传播模式、隔离等级、超时等等的事务设置都可以在TransactionTemplate中或者通过配置或者编程式地实现。 TransactionTemplate实例默认继承了默认事务设置。 下面有个编程式的为一个特定的TransactionTemplate定制事务设置的例子。
transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_UNCOMMITTED);
transactionTemplate.setTimeout(30);

三、声明式事务管理
大多数Spring用户选择声明式事务管理。这是对应用代码影响最小的选择,因此也最符合 非侵入式 轻量级容器的理念。
Spring的声明式事务管理是通过Spring AOP实现的,因为事务方面的代码与Spring绑定并以一种样板式风格使用, 不过尽管如此,你一般并不需要理解AOP概念就可以有效地使用Spirng的声明式事务管理。
特点:
1、Spring声明式事务管理可以在任何环境下使用,只需改配置文件。
2、Spring的声明式事务管理可以被应用到任何类上。
3、Spring提供了声明式的 回滚规则。
4、Spring允许你通过AOP定制事务行为。
回滚规则的概念比较重要:它使我们能够指定什么样的异常(和throwable)将导致自动回滚。我们在配置文件中声明式地指定,无须在Java代码中。同时,我们仍旧可以通过调用 TransactionStatus 的 setRollbackOnly() 方法编程式地回滚当前事务。通常,我们定义一条规则, 声明 MyApplicationException 必须总是导致事务回滚。 这种方式带来了显著的好处,它使你的业务对象不必依赖于事务设施。典型的例子是你不必在代码中导入Spring API,事务等。
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。
声明式事务管理的配置有5种方式:
1、每个Bean都有一个代理
2、所有Bean共享一个代理基类
3、使用拦截器
4、使用tx标签配置的拦截器
5、全注解