您的位置:首页 > 编程语言 > Java开发

Spring声明式事务

2016-04-25 17:24 721 查看
Spring声明式事务

1.事务的概念简单来说就是一个原子操作,要么操作中的几个动作全部执行,要么全部不执行。

2.ACID(原子性,一致性,隔离性和持久性)是事务应该满足的条件,但是一般来说隔离性才是程序员应该做的,因为隔离性其实就是对并发的控制,而经常提及的数据的脏读,幻读等都是并发引起的。 

3.事务在代码中使用; 接着上篇文章配置好的Spring+Hibernate的环境:

@Autowired
private SessionFactory sessionFactory;

private Session getSession(){
return sessionFactory.getCurrentSession();
}
@Transactional
public void insertData(){
User user = new User();
user.setCount(1);
getSession().save(user);

Book book = new Book();
book.setNum(2);4
book.setPrice(1);
getSession().save(book);
}
如上图,在使用需要使用session时候(一般来说只在DaoImpl中使用),只要自动注入SessionFactory,用getCurrentSession获取即可; 一个方法如果需要表明是一个事务,也只需要加上@Transactionl注解即可。

4.事务的传播特性:propagation属性

@Transactional(propagation=Propagation.REQUIRES_NEW)



默认情况下的属性是REQUIRES;如果一个事务方法A,依次包含事务方法B和事务方法C,那么默认情况下当执行A的时候,B和C就会在A的事务中运行, 假设运行到C的时候出现异常,进行回滚,这个事务A都会回滚,B进行的操作就会无效。  如果希望B操作依然是有效的,那就给B配置REQUIRES_NEW属性,即在A中也会开辟新事务,这样当C出错的时候,B的操作依然有效,因为它在执行到C之前已经提交了。  当然如果B和C调换一下,先执行C,那么给B设置这个属性,B中操作也是无效的,因为C已经出错了。

5.其他属性

指定事务的隔离级别:isolation属性,指定隔离的级别,不同级别解决相应的问题,针对之前提到的重复读,脏读等问题。

超时回滚:timeout属性   指定事务一段时间内未执行完,强制回滚。

readonly属性:如果方法内都是只读的操作,数据库可以对其进行优化。

6.Spring默认情况下会对unchecked异常(RuntimeException--运行时异常)和error进行回滚,而对checked异常(编译器可以发现的,可以用try catch进行捕获的)不做回滚。想让其进行回滚的话 1)在try catch中抛出一个自定义的运行时异常  2)配置checked异常时也进行回滚,@Transactional(rollbackFor=Exception.class)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息