`

Spring @Transactional

阅读更多

spring使用注解方式配置事务

 

一,spring配置文件

 <!-- 事务配置 -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>
	
	<!-- 使用annotation注解方式配置事务 -->
	<tx:annotation-driven transaction-manager="transactionManager"/>

 

二,service类

public interface UserService {

	public abstract void addUser(User user);

	public abstract void updateUser(User user)throws Exception;

	public abstract void deleteUser(Integer userId);

	public abstract User findUserById(Integer userId);

	public abstract List<User> findAllUser();

	public abstract User login(User user);

}

 

@Service
@Transactional
public class UserServiceImpl implements UserService {

	@Autowired
	private UserDao userDao;

	@Transactional(rollbackFor=Exception.class)
	public void addUser(User user) {
		userDao.insertUser(user);
	}

	@Transactional(rollbackFor=Exception.class)
	public void updateUser(User user) throws Exception{
		userDao.updateUser(user);
//		int a = 0/0;
//		throw new Exception("aaaa");
	}

	@Transactional(rollbackFor=Exception.class)
	public void deleteUser(Integer userId) {
		userDao.deleteUser(userId);
	}

	@Transactional(propagation=Propagation.NOT_SUPPORTED)
	public User findUserById(Integer userId) {
		return userDao.findUserByid(userId);
	}

	@Transactional(propagation=Propagation.NOT_SUPPORTED)
	public List<User> findAllUser() {
		return userDao.findAll();
	}

	@Transactional(propagation=Propagation.NOT_SUPPORTED)
	public User login(User user) {
		return userDao.userLogin(user);
	}
}

 

 三,@Transactional详解

 在service类前加上@Transactional,声明这个service所有方法需要事务管理。每一个业务方法开始时都会打开一个事务。

Spring默认情况下会对运行期例外(RunTimeException)进行事务回滚。这个例外是unchecked

如果遇到checked意外就不回滚。

如何改变默认规则:

1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)

2 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)

3 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)

 

注意: 如果异常被try{}catch{}了,事务就不回滚了,如果想让事务回滚必须再往外抛try{}catch{throw Exception}。

@Transactional设置:

 

propagation:事务传播性设置,Propagation枚举类型。Spring支持的事务传播属性包括7种:

    PROPAGATION_MANDATORY:方法必须在事务中执行,否则抛出异常。

    PROPAGATION_NESTED:使方法运行在嵌套事务中,否则和PROPAGATION_REQUIRED一样。

    PROPAGATION_NEVER :当前方法永远不在事务中运行,否则抛出异常。

    PROPAGATION_NOT_SUPPORTED:定义为当前事务不支持的方法,在该方法执行期间正在运行的事务会被暂停

    PROPAGATION_REQUIRED:当前的方法必须运行在事务中,如果没有事务就新建一个事务。新事务和方法一起开始,随着方法返回或者抛出异常时终止。

    PROPAGATION_REQUIRED_NEW :当前方法必须新建一个事务,如果当前的事务正在运行则暂停。

    PROPAGATION_SUPPORTS :规定当前方法支持当前事务,但是如果没有事务在运行就使用非事务方法执行。

isolation:事务隔离性级别设置,Isolation枚举类型

    ISOLATION_DEFAULT :使用数据库默认的隔离级别

    ISOLATION_COMMITTED:允许其他事务已经提交的更新(防止脏读取)

    ISOLATION_READ_UNCOMMITTED:允许读取其他事务未提交的更新,会导致三个缺陷发生。执行速度最快

    ISOLATION_REPEATABLE_READ :除非事务自身更改了数据,否则事务多次读取的数据相同(防止脏数据,多次重复读取)

    ISOLATION_SERIALIZABLE:隔离级别最高,可以防止三个缺陷,但是速度最慢,影响性能。

 

readOnly:读写性事务,只读性事务,布尔型

    对数据库的操作中,查询是使用最频繁的操作,每次执行查询时都要从数据库中重新读取数据,有时多次读取的数据都是相同的,这样的数据操作不仅浪费了系统资源,还影响了系统速度。对访问量大的程序来说,节省这部分资源可以大大提    升系统速度。

   将事务声明为只读的,那么数据库可以根据事务的特性优化事务的读取操作

timeout:超时时间,单位秒

事务可能因为某种原因很长时间没有反应,这期间可能锁定了数据库表,影响性能。设置超时时间,如果超过该时间,事务自动回滚。

rollbackFor:一组异常类的实例,遇到时必须进行回滚

rollbackForClassname:一组异常类的名字,遇到时必须进行回滚

noRollbackFor:一组异常类的实例,遇到时必须不回滚

noRollbackForClassname:一组异常类的名字,遇到时必须不回滚

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics