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/
- spring学习笔记11--事务传播
- spring事务传播行为笔记
- spring事务传播机制和隔离级别学习笔记
- Spring.NET学习笔记17——事务传播行为(基础篇) Level 200
- Spring.NET学习笔记17——事务传播行为(基础篇)
- spring学习笔记(22)——事务的传播属性
- spring学习笔记(一)事务的管理和传播特性
- spring事务--传播策略
- Spring 事务传播属性
- spring事务传播特性
- Spring事务传播机制
- Spring事务传播机制
- Spring事务传播机制
- spring事务传播属性
- spring事务传播图解
- spring事务传播机制
- Spring事务传播机制
- Spring事务传播特性
- C编译器、连接器与可执行机器码文件
- php垃圾收集机制
- CentOS和event.h
- AJAX 拖动图片效果(删除 和复位)
- table 显示问题:- (id)initWithFrame:(CGRect)frame 中创建table 然后不显示
- spring学习笔记11--事务传播
- Protocal Buffer
- tomcat做成系统服务
- 分布式搜索Elasticsearch——创建索引
- Webbots、Spiders和Screen Scrapers:技术解析与应用实践(原书第2版)
- cocos2d-x技术资源收藏
- 前端学习前言
- php生成二维码的几种方式
- 前端学习一:HTML和CSS