注:内容来自《JavaWeb应用开发基础教程》,在此仅用来学习
Spring 支持编程式事务管理和声明式事务管理。
- 编程式事务管理:使用代码进行事务管理
- 声明式事务管理:使用
注解
或XML配置进行管理事物
注:实际开发中要尽可能使用声明式事务管理
。尽管不如编程式事务管理灵活,但声明式事务管理允许通过代码控制事物
编程式事务管理
Spring提供了两种编程式事务管理:使用TransactionTemplate
;直接使用一个PlatformTransactionManager
实现。Spring建议使用第一种
声明式事务管理
1、使用XML配置声明式事物
2、使用注解配置声明式事物
在UserServiceImpl
实现类的addTwoUsers(final List<User> users)
方法负责向数据库user表中插入两条记录,插入的两条记录作为一个事物进行,要么一起插入两条数据,要么一条也不会插入,说明使用注解配置Spring声明式事物,其关键代码如下:
@Component("userService")
public class UserServiceImpl implements UserService{
private UserDao userDao;
@Autowired
public UserServiceImpl(UserDao userDao){
this.userDao = userDao;
}
//一次添加两个用户操作
@Override
@Transactional(propagation = Propagation.REQUIRED,readOnly = false)
public void addTwoUsers(final List<User> users){
add(users.get(0));
add(user.get(1));
}
....
}
@Transactional(propagation = Propagation.REQUIRED,readOnly = false)
注解用于addTwoUsers()方法之前,表示对该方法实施SpringAOP事物增强。@Transactional
也可以放于累迁,表示对类中所有的方法进行事物增强
@Transactiona注解只是提供元数据,本身并不能完成事物切面织入,因此还需要在Spring配置文件中进行配置
<!-- 开启事物的注解支持-->
<tx:annotation-driven transaction-manager="transactionManager"/>
配置文件使用<tx:annotation-driven>
元素开启Spring事物的注解支持,这样Spring会自动扫描所有使用@Transactional
注解的Bean,为该Bean的所有方法或某个方法实施事物增强。
@Transactional(rollbackFor = Exception.class)
属性
在使用@Transactional
注解时,在发生异常时默认仅对RuntimeException
和Error
发生回滚,如果是非运行异常(例如:SQLException
、IOException
等)将不会进行回滚。
运行异常和非运行异常关系
Exceptions与Errors的关系
Exceptions:
程序自身可以处理的异常,可以通过catch
的方式捕捉,通常遇到异常时,对其进行处理,从而使程序正常运行(事物)。Exceptions
又分为运行时异常(RuntimeException
,又叫非受检查异常)和非运行时异常(又叫检查异常);
Errors
程序自身不能处理的异常,不能通过catch
的方式捕捉。例如:系统崩溃、内存不足、堆栈溢出等。编辑器不会对这类错误进行检测,一旦错误发生,程序便被终止,仅靠程序自身,永远也不会恢复