Spring @transactional annotation 事务使用详解

摘要: annotation 方式写程序越来越称谓主流了,以前用hibernate 也用 xml 一大堆配置文件。spring beans 管理也是一大堆xml 配置文件,但现在的趋势是 annotation ,这种方式写程序更方便,很少配置文件,维护起来也比较方便。这几天重新看 spring 的文档,仔细看了下 annotation 方式下事务的管理方式.

annotation 方式写程序越来越称谓主流了,以前用hibernate 也用 xml 一大堆配置文件。spring beans 管理也是一大堆xml 配置文件,但现在的趋势是 annotation ,这种方式写程序更方便,很少配置文件,维护起来也比较方便。这几天重新看 spring 的文档,仔细看了下 annotation 方式下事务的管理方式.
1. 配置 : 告诉spring 去读 @Transactional 标注
2. : 自动包装代码,生产事务管理
3. 初始化 Datasource TransactionManager bean.





  


  
  
  
  
  

	

  


  



如果 @Transactional 标注在 Class 上面, 那么将会对这个 Class 里面所有的 public 方法都包装事务方法. 它有几个属性是可以配置的 readOnly, isolation, propagation,rollbackFor, noRollbackFor 。如果标记 readOnly=true, 那么就只能选择了,因为只有查询语句才能执行,如果是insert,update,delete 等,应该是readOnly=false, 不过默认是false的。rollbackFor 和 noRollbackFor 也是比较重要的两个属性. 默认情况下在有异常 RuntimeException 抛出或者 unchecked 异常抛出时,会回滚.

借用官方的例子:
@Transactional
public class AnnotatedUserDao implements IUserDao {
private JdbcTemplate jdbcTemplate;
 
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
  this.jdbcTemplate = jdbcTemplate;
}
	
public void deleteUser(int uid) {
  String delQuery = "delete from users where id = ?";
  jdbcTemplate.update(delQuery, new Object[] { uid });
 
}
 
public int insertUser(User user) {
  String inserQuery = "insert into users (username, password, enabled , id) values (?, ?, ?, ?) ";
  Object[] params = new Object[] { user.getUserName(),
				user.getPassword(), user.isEnabled(), user.getId() };
  int[] types = new int[] { Types.VARCHAR, Types.VARCHAR, Types.BIT,
				Types.INTEGER };
  int number = jdbcTemplate.update(inserQuery, params, types);
  return number;
}
 
// override the class level transactional behaviour for select method
@Transactional(readOnly = true)
public User selectUser(int uid) {
// for all the RuntimeExceptions the transactions will be automatically
// rolled back
  throw new RuntimeException("A runtime exception");
 
}
 
public int updateUser(User user) throws Exception {
  throw new Exception("A checked exception");
}


selectUser 会回滚,因为抛出了 RuntimeException 异常,而 updateUser 会执行下去,并不回滚,因为抛出的是 A checked exception .


原理: 其实就是利用 AOP , spring 生成了一个代理类 这个代理类加入了事务的控制来实现。

上一篇: spring,hibernate,ibatis in action 电子书下载
下一篇: javascript异步处理与Jquery的deferred对象总结
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号