Chinaunix首页 | 论坛 | 博客
  • 博客访问: 518530
  • 博文数量: 135
  • 博客积分: 3568
  • 博客等级: 中校
  • 技术积分: 1942
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-19 17:52
文章分类

全部博文(135)

文章存档

2012年(29)

2011年(41)

2010年(26)

2009年(12)

2008年(9)

2007年(12)

2006年(6)

分类: Java

2012-04-25 15:05:48

不断完善中,有一点先记一点吧。
---------------


点击(此处)折叠或打开

  1. public void test() {
  2.         DefaultTransactionDefinition tranDef = new DefaultTransactionDefinition();
  3.         tranDef.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);

  4.         PlatformTransactionManager tranMgr = null; // TODO: 由 Spring 依赖注入
  5.         TransactionStatus tranStatus = null;
  6.         try {
  7.             // 开启事务
  8.             // 如果需要了解下面的业务操作和这里的事务定义是如何结合在一起的,
  9.             // 需要在跟踪此方法的代码。
  10.             // 其技术的核心原理是 TransactionSynchronizationManager 中各种ThreadLocal变量
  11.             // 和DataSourceUtils.getConnection() 的组合使用。
  12.             tranStatus = tranMgr.getTransaction(tranDef);

  13.             // 业务操作(1) - 直接使用JDBC的connection
  14.             // 注意:需要与上面的事务管理器使用的数据源一致
  15.             DataSource dataSource = null; // TODO: 由 Spring 依赖注入
  16.             Connection conn = DataSourceUtils.getConnection(dataSource);
  17.             // ...

  18.             // 业务操作(2) - 使用JDBCTemplate的connection
  19.             dataSource = null; // TODO: 由 Spring 依赖注入
  20.             JdbcTemplate jdbcTemplate = new JdbcTemplate (dataSource);
  21.             jdbcTemplate.update("INSERT INTO XXX (C1,C2) VALUES(1,2)");
  22.             // ...

  23.             // 业务操作(3) - 使用MyBatis的SqlMapClient
  24.             SqlMapClient sqlMapClient = null; // TODO: 由 Spring 依赖注入
  25.             sqlMapClient.insert("SQLID_001");
  26.             // ...

  27.             // 提交事务
  28.             tranMgr.commit(tranStatus);
  29.         } catch (Exception e) {
  30.             if (tranStatus != null) {
  31.                 try {
  32.                     // 回滚事务
  33.                     tranMgr.rollback(tranStatus);
  34.                 } catch (Exception e2) {
  35.                 }
  36.             }
  37.         }
  38.     }


丫丫的,编程式事务管理还真容易出错,一个错误害得我弄了一天。给大家提个醒:
   一定要在每个return、throw语句之前都确保事务已经被commit或rollback了。
   否则,就等着处理这样的异常吧:
org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object
.......


比如:

点击(此处)折叠或打开

  1. public void funcA() {
  2.     DefaultTransactionDefinition tranDef = new DefaultTransactionDefinition();
  3.     tranDef.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
  4.     PlatformTransactionManager tranMgr = null;
  5.     TransactionStatus tranStatus = null;
  6.     try {
  7.         tranStatus = tranMgr.getTransaction(tranDef);

  8.         funcB();
  9.         // 如果 funcB 中执行了其中的 if 语句——没commit就返回,下面的更新极有可能会因为上一个事务未结束而一直等待。
  10.         // update table XXX,

  11.         tranMgr.commit(tranStatus);
  12.     } catch (Exception e) {
  13.         if (tranStatus != null) {
  14.             try {
  15.                 tranMgr.rollback(tranStatus);
  16.             } catch (Exception e2) {
  17.             }
  18.         }
  19.     }
  20. }

  21. public void funcB() {
  22.     DefaultTransactionDefinition tranDef = new DefaultTransactionDefinition();
  23.     tranDef.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
  24.     PlatformTransactionManager tranMgr = null;
  25.     TransactionStatus tranStatus = null;
  26.     try {
  27.         tranStatus = tranMgr.getTransaction(tranDef);

  28.         if( someCondition){
  29.           // do something
  30.           return;// without commit;
  31.         }

  32.         // do something

  33.         tranMgr.commit(tranStatus);
  34.     } catch (Exception e) {
  35.         if (tranStatus != null) {
  36.             try {
  37.                 tranMgr.rollback(tranStatus);
  38.             } catch (Exception e2) {
  39.             }
  40.         }
  41.     }
  42. }





阅读(1089) | 评论(0) | 转发(0) |
0

上一篇:气4人的JS错误

下一篇:Shell 笔记

给主人留下些什么吧!~~