spring学习笔记11--事务传播

来源:互联网 发布:人工智能 医疗诊断 编辑:程序博客网 时间:2024/05/06 14:00

最近在复习spring,欢迎各位大侠赐教和交流 ---------QQ:767872620

对于事务的回滚:
默认情况下:
spring容器对运行期(unchecked的RuntimeException)的意外进行事务的回滚。
如果碰到的是用户的(checked的Exception)的意外,事务将不会回滚

 /**
  * 手动设置对非运行期的异常进行事务回滚
  */
 @Transactional(RollbackFor=Exception.class)
 public void delete(Integer id)throws Exception {
  String sql = "delete from  person where id=?";
  Object[] args=new Object[]{id};
  int[] argTypes = new int []{java.sql.Types.INTEGER};
  this.jdbcTemplate.update(sql, args, argTypes);
  throw new Exception("非运行期意外");
 }
 
  /**
  * 手动设置对运行期的异常不进行事务回滚
  */
  @Transactional(noRollbackFor=RuntimeException.class)
 public void delete(Integer id)throws Exception {
  String sql = "delete from  person where id=?";
  Object[] args=new Object[]{id};
  int[] argTypes = new int []{java.sql.Types.INTEGER};
  this.jdbcTemplate.update(sql, args, argTypes);
  throw new RuntimeException("非运行期意外");
 }
 
 /**
  * String sql    :SQL语句
  * Object[] args   :参数
  * RowMapper<T> rowMapper :有数据后的回调方法  在PersonRowMapper.java中用于封装对象
  * 对于查询可以方法可以关闭事务来节省资源和时间
  * @Transactional(propagation=Propagation.NOT_SUPPORTED)
  * 手动设置不支持事务:这样在在方法执行前不会开启事务
  */
 @Transactional(propagation=Propagation.NOT_SUPPORTED)
 public Person getPerson(Integer id) {
  String sql = "Select * from person where id=?";
  Object[]args = new Object[]{id};
  
  return  this.jdbcTemplate.queryForObject(sql, args, new PersonRowMapper());
  
 }
 
 
 事务传播属性Propagation:
 REQUIRED(默认情况是这样):业务方法需要在一个事务中运行。如果方法运行时,已经处在一个事务中,那么加入到该事物,否则为自己创建一个新的事务。
 NOT_SUPPOKTED:声明方法不需要事务。若果方法没有关联到一个事务,容器将不会为他开启事务,
 如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会恢复执行。
 REQUIRESHEW:属性表明不管是否存在事务,业务方法总会为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有的事务会被挂起,新的事务会被创建,直到方法执行结束,新事务才算结束,原先的事务才会恢复执行。
 MANDATORY:该属性业务方法只能在一个已存在的事务中执行,业务方法不能发起自己的事务。
 如果业务方法在没有事务的环境下调用,容器就会抛出例外。
 SUPPOKTS:这一事务属性表明,如果业务方法在某个事务范围内被调用,则方法成为该事务的一部分。
 如果业务方法在事务范围外调用,则方法在没有事务的环境下执行。
 Never:指定业务方法绝对不能在事务范围内执行。如果业务方法在某个事务中执行,容器会抛出例外,只有业务方法没有关联到任何事务,才能正常执行。
 NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行,他使用了一个单独的事务,这个事务拥有多个可以回滚的保存点,
 内部事务的回滚不会对外部事务造成影响。他只对DataSourceTransactionManager事务管理器起效。
 内部失败回滚到保存点,外部失败回滚整个
 
 readOnly="true" 只读事务,不能用于更新。提高效率
 timeout 事务的超时时间,默认是30秒超时
 isolation 事务隔离级别:
 不同个隔离级别采用不同的锁类型来实现,在四中隔离级别中,Serializable的隔离级别最高,
 Read Uncommited的隔离级别最低,大多数据库默认的隔离级别为Read Uncommited,如SQLServer,当然也有少部分数据库的
 默认隔离级别是Repeatable Read,如 Mysql
 
 Read Uncommited:读未提交数据(会出现脏读,不可重复读和幻读)。
 Read commited:读已提交数据(会出现不可重复读和幻读)
 Repeatable Read:可重复读(会出现幻读)
 Serializable:串行化
 
 脏读:一个事务读取另一个事务未提交的更新数据。
 不可重复度:在同一个事务中,多次读取同一数据返回的结果有所不同,换句话说就是,
 后续读取可以读到另一事务已提交的更新数据。
 可重复读:在同一事务中多次读取数据时,能够保证所读数据一样,也就是,后续读取不能读到
 另一事务已提交的更细数据。
 幻读:一个事务读取到另一事务已提交的insert数据。
 

扩展阅读:

事务传播介绍:
http://blog.163.com/pengzhi_min/blog/static/17456534420117832830115/