Spring声明式事务

纸上得来终觉浅

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

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

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

<span style="white-space:pre">	</span>@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属性

<pre name="code" class="java">@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属性:如果方法内都是只读的操作,数据库可以对其进行优化。

你可能感兴趣的:(spring,事务,spring事务,声明式事务,spring声明式事务)