WEB开发网
开发学院软件开发Java Spring 事务管理高级应用难点剖析,第 1 部分 阅读

Spring 事务管理高级应用难点剖析,第 1 部分

 2010-03-22 00:00:00 来源:WEB开发网   
核心提示: PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,Spring 事务管理高级应用难点剖析,第 1 部分(10),把当前事务挂起,PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,我们来看一下实例,UserService#logon() 方法内部

PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与 PROPAGATION_REQUIRED 类似的操作。

Spring 默认的事务传播行为是 PROPAGATION_REQUIRED,它适合于绝大多数的情况。假设 ServiveX#methodX() 都工作在事务环境下(即都被 Spring 事务增强了),假设程序中存在如下的调用链:Service1#method1()->Service2#method2()->Service3#method3(),那么这 3 个服务类的 3 个方法通过 Spring 的事务传播机制都工作在同一个事务中。

下面,我们来看一下实例,UserService#logon() 方法内部调用了 UserService#updateLastLogonTime() 和 ScoreService#addScore() 方法,这两个类都继承于 BaseService。它们之间的类结构说明如下:

图 1. UserService 和 ScoreService
Spring 事务管理高级应用难点剖析,第 1 部分

具体的代码如下所示:

清单 9 UserService.java

@Service("userService") 
public class UserService extends BaseService { 
  @Autowired 
  private JdbcTemplate jdbcTemplate; 
  @Autowired 
  private ScoreService scoreService; 
 
  public void logon(String userName) { 
    updateLastLogonTime(userName); 
    scoreService.addScore(userName, 20); 
  } 
 
  public void updateLastLogonTime(String userName) { 
    String sql = "UPDATE t_user u SET u.last_logon_time = ? WHERE user_name =?"; 
    jdbcTemplate.update(sql, System.currentTimeMillis(), userName); 
  } 
} 

上一页  5 6 7 8 9 10 

Tags:Spring 事务管理 高级

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接