spring 支持注解式事务,作用于方法级别,我们如果想将事务放进行级别,可以使用编程式事务,如使用 TransactionTemplate。还有另外一种使用 Lambda 表达式,结合事务注解来达到行级别的事务,通过将一个方法接口传入,在一个注解事务方法中执行,就达到了行级别的事务控制。
public class Transactions {
private static final ThreadLocal<Boolean> tl = new ThreadLocal<>();
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Throwable.class, timeout = 15)
public <T> T requiredNew(Supplier<T> supplier) {
Boolean flag = tl.get();
if (flag != null) {
throw new RuntimeException("nested transaction is not supported!");
}
try {
tl.set(true);
return supplier.get();
} finally {
tl.remove();
}
}
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class, timeout = 15)
public <T> T required(Supplier<T> supplier) {
return supplier.get();
}
}
@Service
public class Dmeo{
@Autowired
private Transactions transactions;
public void demo(){
transactions.required(() -> {
// do something
});
}
}