云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 编程式文档

编程式文档

  • 62 次阅读
  • 3 次下载
  • 2025/6/28 11:50:43

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 {

搜索更多关于: 编程式文档 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

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. @Be

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com