まず、Springのトランザクションには2つの方法があります。プログラミングトランザクションと宣言型トランザクションです。
プログラミングトランザクション:
プロジェクトでトランザクションマネージャーDataSourceTransactionManagerを取得します
トランザクション管理を使用してロールバック操作をコミットする
@Component
public class TransactionUtils {
@Autowired
private DataSourceTransactionManager dataSourceTransactionManager;
//获取当前事务
public TransactionStatus begin(){
//采用默认传播行为
TransactionStatus transaction = dataSourceTransactionManager.getTransaction(new DefaultTransactionAttribute());
return transaction;
}
//提交
public void commit(TransactionStatus transaction){
dataSourceTransactionManager.commit(transaction);
}
public void rollback(TransactionStatus transaction){
dataSourceTransactionManager.rollback(transaction);
}
}
ビジネスレイヤー
@RestController
public class TxServiceImpl {
@Autowired
private TransactionUtils transactionUtils;
//采取事务
@GetMapping("/tx")
public String insertUser(User user){
TransactionStatus begin == null;
//begin开启事务,若不提交相当于对数据使用行锁
try {
begin = transactionUtils.begin();
String res = userMapper.insert(user)>0?"成功":"失败";
int j = 1/user.getUserId();
transactionUtils.commit(begin);
return res;
}catch (Exception e){
if (begin != null){
transactionUtils.rollback(begin);
return "系统错误";
}
}
}
}
強力なコードの繰り返しと優れたスケーラビリティ
トランザクションを宣言します:
アノテーション@Transactionalを追加するだけです
メソッドが実行されると、aopはインターセプトを取得し、それが成功したか異常であるかを判断して、対応するアクションを実行します。
失敗の問題:
メソッドでtryを使用して例外がキャッチされた場合、例外はaopにスローされず、ロールバックされません。
キャッチで使用するには、手動でロールバックする必要があります
TransactionAspectSupport.currentTransactionStatus()。set
RollbackOnly();
カスタムアノテーション
注釈を作成する
//作用范围
@Target({ElementType.METHOD,ElementType.TYPE})
//通过反射机制获取注解
@Retention(RetentionPolicy.RUNTIME)
@Inherited
//注释文档
@Documented
public @interface MyTransactional {
}
aopインターセプトメソッドを定義する
@Component
@Aspect
public class ExtTransactionalAop {
@Autowired
private TransactionUtils transactionUtils;
//拦截方法上有自定义注解 走环绕通知
@Around(value = "@annotation(com.lzq.aop.MyTransactional)")
public Object around(ProceedingJoinPoint joinPoint){
TransactionStatus begin = null;
try {
begin = transactionUtils.begin();
//获取目标方法
Object res = joinPoint.proceed();
transactionUtils.commit(begin);
return res;
} catch (Throwable throwable) {
throwable.printStackTrace();
if (begin != null){
transactionUtils.rollback(begin);
}
return "系统错误";
}
}
}
この時点で、メソッドにカスタムアノテーションを追加できます