Spring 事务

179 阅读2分钟

有时候做一件事很容易,但是维护一件事却很难,现在许许多多的技术,其实很多都是在处理一旦发生了问题,该怎么补救,许许多多的技术难点不在于如果完成一件事,而是发生了错误该怎么挽回,事务就是这种思想的实践,下面说说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) 十分重要