使用org.springframework.transaction.support.TransactionTemplate类,
TransactionTemplate封装了事务管理的功能,包括异常时的事务回滚,以及操作成
功后的事务提交。在doInTransaction中进行的操作,如果抛出未捕获异常将被自动回滚,
如果成功执行,则将被自动提交。使用TransactionTemplate类,必须实现TransactionCallback接口,
transactionCallback只有一个实现方法,使用匿名内部类,doInTransaction()处理事务。
类似与JDbcTemplate,Callback类的编写违背很多人的编程习惯,传进匿名类之前要改成final。
配置文件
<bean id="transactionTemplate" class="org.springframework.
transaction.support.TransactionTemplate">
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
</bean>
DAO中
<property name=" transactionTemplate">
<ref bean=" transactionTemplate"/>
</property>
使用TransactionTemplate的doInTransaction() 不能抛出任何checked exceptions,必须将异常包装为unchecked exceptions,
因为TransactionTemplate不支持throws
下面是代码
transactionTemplate.execute(
new TransactionCallback() {
public Object doInTransaction(TransactionStatus ts) {
try {
// do stuff
} catch (Exception e) {
ts.setRollbackOnly();
}
return null;
}
}
);
使用PlatformTransactionManager效率更高
package module;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.dao.DataAccessException;
import javax.sql.DataSource;
public class testTranORacleDAO {
private static DataSource dataSource;
private static PlatformTransactionManager transactionManager;
private static JdbcTemplate jt;
public static void main(String[] args) {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:ILoveMM");
dataSource.setUsername("system");
dataSource.setPassword("manager");
DataSourceTransactionManager tm = new DataSourceTransactionManager();
tm.setDataSource(dataSource);
transactionManager = tm;
doUpdate(dataSource);
}
public static void doUpdate(DataSource dataSource) {
DefaultTransactionDefinition td = new DefaultTransactionDefinition(
TransactionDefinition.PROPAGATION_REQUIRED);
td.setIsolationLevel(TransactionDefinition.ISOLATION_SERIALIZABLE);
td.setTimeout(10);
TransactionStatus status = transactionManager.getTransaction(td);
try {
update(dataSource);
} catch (DataAccessException e) {
transactionManager.rollback(status);
throw e;
}
transactionManager.commit(status);
}
public static void update(DataSource dataSource) {
jt = new JdbcTemplate(dataSource);
jt.update("delete from beers where id=2 ");
jt.update("insert into beers(id,BRAND,price) values(1,'3',100)");
}
}
分享到:
相关推荐
《Spring5高级编程第五版》是一本深入探讨Spring框架...通过阅读《Spring5高级编程第五版》英文版,开发者不仅可以掌握Spring5的新特性,还能提升自己的编程思维和实战能力,为在企业级项目中运用Spring打下坚实基础。
在Spring框架中,事务管理是应用开发中的关键部分,它确保了数据操作的一致性和完整性。Spring提供了多种事务管理方式,其中编程式事务管理和声明式事务管理是两种主要的模式。编程式事务管理允许开发者通过代码来...
1. **Spring编程式事务管理**: 编程式事务管理允许开发者在代码中直接控制事务的开始、提交、回滚等操作。这种方式提供了更大的灵活性,但可能导致事务管理代码分散在整个应用中,增加维护难度。通常,这种方式...
1. **基于XML的声明式事务管理**: 在Spring的配置文件中,我们可以通过`<tx:advice>`、`<aop:config>`等元素定义事务的边界,指定哪些方法需要在事务中运行。 2. **基于注解的声明式事务管理**: 使用@Transactional...
Spring 提供了多种方式来实现编程式事务管理,例如使用 TransactionTemplate 或者直接使用 PlatformTransactionManager。 声明式事务管理 声明式事务管理是指通过配置文件或注解来管理事务。 Spring 提供了多种...
Spring 声明事务、编程事务实现 Spring 声明事务是指使用 Spring 框架来管理事务,实现事务控制。声明式事务管理是建立在 AOP 之上的,它的本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务...
总结来说,这篇笔记介绍了Spring的编程式事务管理,包括使用PlatformTransactionManager接口,事务的ACID特性,以及如何在业务逻辑中正确地开始、提交和回滚事务。同时,结合“test_hibernate_1”文件,我们可以...
《Spring框架高级编程源代码》第十章主要涵盖了Spring框架中的核心特性和高级应用,这些内容对于深入理解Spring以及提升开发效率至关重要。在这个章节中,我们可以期待学习到以下几个关键知识点: 1. **AOP(面向切...
例如,`PROPAGATION_REQUIRED` 表示如果当前存在事务,则加入到当前事务中;如果不存在,则新建一个事务。其他的传播行为还有 `PROPAGATION_SUPPORTS`、`PROPAGATION_MANDATORY`、`PROPAGATION_REQUIRES_NEW`、`...
Spring 声明式事务和Spring 编程式事务
本教程将深入探讨如何在Spring中实现自定义事务管理器、编程式事务处理以及声明式事务`@Transactional`的使用。 首先,让我们了解事务管理的基本概念。事务是一组数据库操作,这些操作要么全部执行,要么全部回滚,...
Spring提供了一套基于TaskExecutor的异步任务处理机制,结合@Transactional注解,可以在异步执行的代码块中使用声明式事务管理。但这需要开发者对异步执行的事务特性有充分理解,因为事务的同步特性可能会受到影响。...
本主题将深入探讨Hibernate的编程式事务管理和Spring AOP的声明式事务管理,以及两者如何在实际项目中集成使用。 **Hibernate编程式事务管理** Hibernate作为流行的ORM(对象关系映射)框架,提供了对JDBC事务的...
文件"基于Spring的JMS编程-1"可能包含了关于如何在Spring环境中配置和使用JMS的详细步骤,包括XML配置、代码示例以及可能的实战项目案例。进一步学习这些内容,你将能够熟练掌握Spring框架下的JMS编程技巧,从而在...
2. **隔离级别**:指定了事务中的SQL查询与更新操作的隔离程度,如`ISOLATION_DEFAULT`、`ISOLATION_READ_COMMITTED`等。 3. **回滚规则**:定义了在哪些异常发生时需要回滚事务,默认情况下未检查异常(即继承自`...
这样,每次数据库操作通过AOP代理时,都能够从ThreadLocal中获取到当前事务的状态,从而决定是否需要加入到当前事务中。 接下来,我们来看`SimpleConnectionPool`这个文件。这可能是数据库连接池的一个实现,通常...
在本篇"Spring学习之八--Hibernate编程式事务"中,我们将探讨如何在Spring框架中使用Hibernate进行编程式事务管理。编程式事务管理是相对于声明式事务管理的一种方式,它允许开发者通过代码来显式控制事务的开始、...