当前位置:首页 > 编程式文档
java代码:
Java代码
1. package cn.javass.spring.chapter9; 2. //省略import
3. public class TransactionTest {
4. private static ApplicationContext ctx;
5. private static PlatformTransactionManager txManager; 6. private static DataSource dataSource; 7. private static JdbcTemplate jdbcTemplate; 8. ??
9. @BeforeClass
10. public static void setUpClass() {
11. String[] configLocations = new String[] {
12. \
13. \14. ctx = new ClassPathXmlApplicationContext(configLocations); 15. txManager = ctx.getBean(PlatformTransactionManager.class); 16. dataSource = ctx.getBean(DataSource.class); 17. jdbcTemplate = new JdbcTemplate(dataSource); 18. } 19. ?? 20. }
3.3、使用高级别方案JdbcTemplate来进行事务管理器测试:
java代码:
Java代码
1. @Test
2. public void testPlatformTransactionManager() {
3. DefaultTransactionDefinition def = new DefaultTransactionDefinition(
);
4. def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED
);
5. def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRE
D);
6. TransactionStatus status = txManager.getTransaction(def);
7. jdbcTemplate.execute(CREATE_TABLE_SQL); 8. try {
9. jdbcTemplate.update(INSERT_SQL, \10. txManager.commit(status); 11. } catch (RuntimeException e) { 12. txManager.rollback(status); 13. }
14. jdbcTemplate.execute(DROP_TABLE_SQL); 15. }
? DefaultTransactionDefinition:事务定义,定义如隔离级别、传播行为等,即在
?
? ? ?
本示例中隔离级别为ISOLATION_READ_COMMITTED(提交读),传播行为为PROPAGATION_REQUIRED(必须有事务支持,即如果当前没有事务,就新建一个事务,如果已经存在一个事务中,就加入到这个事务中)。
TransactionStatus:事务状态类,通过PlatformTransactionManager的
getTransaction方法根据事务定义获取;获取事务状态后,Spring根据传播行为来决定如何开启事务;
JdbcTemplate:通过JdbcTemplate对象执行相应的SQL操作,且自动享受到事务支持,注意事务是线程绑定的,因此事务管理器可以运行在多线程环境; txManager.commit(status):提交status对象绑定的事务;
txManager.rollback(status):当遇到异常时回滚status对象绑定的事务。
3.4、使用低级别解决方案来进行事务管理器测试:
java代码:
Java代码
1. @Test
2. public void testPlatformTransactionManagerForLowLevel1() {
3. DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
4. TransactionStatus status = txManager.getTransaction(def); 5. Connection conn = DataSourceUtils.getConnection(dataSource); 6. try {
7. conn.prepareStatement(CREATE_TABLE_SQL).execute();
8. PreparedStatement pstmt = conn.prepareStatement(INSERT_SQL); 9. pstmt.setString(1, \10. pstmt.execute();
11. conn.prepareStatement(DROP_TABLE_SQL).execute(); 12. txManager.commit(status); 13. } catch (Exception e) {
14. status.setRollbackOnly(); 15. txManager.rollback(status); 16. } finally {
17. DataSourceUtils.releaseConnection(conn, dataSource); 18. } 19. } 20.
低级别方案中使用DataSourceUtils获取和释放连接,使用txManager开管理事务,而且面向JDBC编程,比起模板类方式来繁琐和复杂的多,因此不推荐使用该方式。在此就不介绍数据源代理类使用了,需要请参考platformTransactionManagerForLowLevelTest2测试方法。
到此事务管理是不是还很繁琐?必须手工提交或回滚事务,有没有更好的解决方案呢?Spring提供了TransactionTemplate模板类来简化事务管理。
9.3.4 使用TransactionTemplate
TransactionTemplate模板类用于简化事务管理,事务管理由模板类定义,而具体操作需要通过TransactionCallback回调接口或TransactionCallbackWithoutResult回调接口指定,通过调用模板类的参数类型为TransactionCallback或
TransactionCallbackWithoutResult的execute方法来自动享受事务管理。 TransactionTemplate模板类使用的回调接口:
? TransactionCallback:通过实现该接口的“T
doInTransaction(TransactionStatus status) ”方法来定义需要事务管理的操作代码;
? TransactionCallbackWithoutResult:继承TransactionCallback接口,提供“void
doInTransactionWithoutResult(TransactionStatus status)”便利接口用于方便那些不需要返回值的事务操作代码。 1、接下来演示一下TransactionTemplate模板类如何使用:
java代码:
Java代码
1. @Test
2. public void testTransactionTemplate() {//位于TransactionTest类中 3. jdbcTemplate.execute(CREATE_TABLE_SQL);
4. TransactionTemplate transactionTemplate = new TransactionTemplate(txMa
nager);
5. transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_
READ_COMMITTED);
6. transactionTemplate.execute(new TransactionCallbackWithoutResult() {
7. @Override
8. protected void doInTransactionWithoutResult(TransactionStatus stat
us) {
9. jdbcTemplate.update(INSERT_SQL, \10. }});
11. jdbcTemplate.execute(DROP_TABLE_SQL); 12. }
? TransactionTemplate :通过new TransactionTemplate(txManager)创建事务模板
类,其中构造器参数为PlatformTransactionManager实现,并通过其相应方法设
置事务定义,如事务隔离级别、传播行为等,此处未指定传播行为,其默认为PROPAGATION_REQUIRED;
? TransactionCallbackWithoutResult:此处使用不带返回的回调实现,其
doInTransactionWithoutResult方法实现中定义了需要事务管理的操作; ? transactionTemplate.execute():通过该方法执行需要事务管理的回调。 这样是不是简单多了,没有事务管理代码,而是由模板类来完成事务管理。
注:对于抛出Exception类型的异常且需要回滚时,需要捕获异常并通过调用status对象的setRollbackOnly()方法告知事务管理器当前事务需要回滚,如下所示:
java代码:
Java代码
1. try {
共分享92篇相关文档