不断完善中,有一点先记一点吧。
---------------
- public void test() {
- DefaultTransactionDefinition tranDef = new DefaultTransactionDefinition();
- tranDef.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
- PlatformTransactionManager tranMgr = null; // TODO: 由 Spring 依赖注入
- TransactionStatus tranStatus = null;
- try {
- // 开启事务
- // 如果需要了解下面的业务操作和这里的事务定义是如何结合在一起的,
- // 需要在跟踪此方法的代码。
- // 其技术的核心原理是 TransactionSynchronizationManager 中各种ThreadLocal变量
- // 和DataSourceUtils.getConnection() 的组合使用。
- tranStatus = tranMgr.getTransaction(tranDef);
- // 业务操作(1) - 直接使用JDBC的connection
- // 注意:需要与上面的事务管理器使用的数据源一致
- DataSource dataSource = null; // TODO: 由 Spring 依赖注入
- Connection conn = DataSourceUtils.getConnection(dataSource);
- // ...
- // 业务操作(2) - 使用JDBCTemplate的connection
- dataSource = null; // TODO: 由 Spring 依赖注入
- JdbcTemplate jdbcTemplate = new JdbcTemplate (dataSource);
- jdbcTemplate.update("INSERT INTO XXX (C1,C2) VALUES(1,2)");
- // ...
- // 业务操作(3) - 使用MyBatis的SqlMapClient
- SqlMapClient sqlMapClient = null; // TODO: 由 Spring 依赖注入
- sqlMapClient.insert("SQLID_001");
- // ...
- // 提交事务
- tranMgr.commit(tranStatus);
- } catch (Exception e) {
- if (tranStatus != null) {
- try {
- // 回滚事务
- tranMgr.rollback(tranStatus);
- } catch (Exception e2) {
- }
- }
- }
- }
丫丫的,编程式事务管理还真容易出错,一个错误害得我弄了一天。给大家提个醒:
一定要在每个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
.......
比如:
- public void funcA() {
- DefaultTransactionDefinition tranDef = new DefaultTransactionDefinition();
- tranDef.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
- PlatformTransactionManager tranMgr = null;
- TransactionStatus tranStatus = null;
- try {
- tranStatus = tranMgr.getTransaction(tranDef);
- funcB();
- // 如果 funcB 中执行了其中的 if 语句——没commit就返回,下面的更新极有可能会因为上一个事务未结束而一直等待。
- // update table XXX,
- tranMgr.commit(tranStatus);
- } catch (Exception e) {
- if (tranStatus != null) {
- try {
- tranMgr.rollback(tranStatus);
- } catch (Exception e2) {
- }
- }
- }
- }
- public void funcB() {
- DefaultTransactionDefinition tranDef = new DefaultTransactionDefinition();
- tranDef.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
- PlatformTransactionManager tranMgr = null;
- TransactionStatus tranStatus = null;
- try {
- tranStatus = tranMgr.getTransaction(tranDef);
- if( someCondition){
- // do something
- return;// without commit;
- }
- // do something
- tranMgr.commit(tranStatus);
- } catch (Exception e) {
- if (tranStatus != null) {
- try {
- tranMgr.rollback(tranStatus);
- } catch (Exception e2) {
- }
- }
- }
- }
阅读(1129) | 评论(0) | 转发(0) |