有时候做一件事很容易,但是维护一件事却很难,现在许许多多的技术,其实很多都是在处理一旦发生了问题,该怎么补救,许许多多的技术难点不在于如果完成一件事,而是发生了错误该怎么挽回,事务就是这种思想的实践,下面说说Spring的事务。
因为我学习时是写在代码中的,所以就偷个懒也就直接粘贴了代码。
/**
* REQUIRED是默认的事务传播
* 如果线程上下文有事务,就用线程上下文的事务
* 如果没有就用这个指定的事务
* 因为他是默认的,所以也可以不写
* @param user
*/
@Transactional(propagation = Propagation.REQUIRED)
public void requiredExample(String user) {
// ...
}
/**
* SUPPORTS的事务传播
* 如果线程上下文有事务,就用线程上下文的事务
* 如果没有那么这个方法不使用事务,应该会影响里面
* @param user
*/
@Transactional(propagation = Propagation.SUPPORTS)
public void supportsExample(String user) {
// ...
}
/**
* MANDATORYS的事务传播
* 如果线程上下文没有事务,则抛出异常
* @param user
*/
@Transactional(propagation = Propagation.MANDATORY)
public void mandatoryExample(String user) {
// ...
}
/**
* NEVER的事务传播
* 如果线程上下文有事务,则抛出异常
* @param user
*/
@Transactional(propagation = Propagation.NEVER)
public void neverExample(String user) {
// ...
}
/**
* NOT_SUPPORTED的事务传播
* 如果线程上下文有事务,则将事务挂起,然后以不使用事务的方式执行这个方法
* @param user
*/
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void notSupportedExample(String user) {
// ...
}
/**
* REQUIRES_NEW的事务传播
* 如果线程上下文有事务,则将事务挂起,然后新建一个事务执行这个方法
* @param user
*/
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void requiresNewExample(String user) {
// ...
}
/**
* NESTED的事务传播 这个有点吊
* 如果线程上下文有事务,则建立一个保存点 如果回滚会回滚到这个保存点
* @param user
*/
@Transactional(propagation = Propagation.NESTED)
public void nestedExample(String user) {
// ...
}
除此之外还有spring的事务隔离级别,之前说了数据库的隔离级别,其实spring也可以定义隔离级别,和数据库是一样的,也就不多说了。
在多说一点的是
/**
% 这样声明无论是check异常还是uncheck异常 只要抛出就会回滚
*/
@Transactional(rollbackFor = Exception.class)
public void exceptionExample(String user) throw exception {
// ...
}
这个段代码,如果在service层被捕获,他是会回滚的
/**
% 这样声明,抛出异常只有check异常会回滚
*/
@Transactional(rollbackFor = Exception.class)
public void exceptionExample(String user) throw exception {
// ...
}
所以,加上
@Transactional(rollbackFor = Exception.class)
十分重要
网友评论