MyDynamicDataSourceAutoRollbackInterceptor.java 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package jnpf.database.plugins;
  2. import com.baomidou.dynamic.datasource.tx.TransactionContext;
  3. import jnpf.database.util.ConnUtil;
  4. import org.apache.ibatis.executor.Executor;
  5. import org.apache.ibatis.mapping.MappedStatement;
  6. import org.apache.ibatis.plugin.Interceptor;
  7. import org.apache.ibatis.plugin.Intercepts;
  8. import org.apache.ibatis.plugin.Invocation;
  9. import org.apache.ibatis.plugin.Signature;
  10. import org.springframework.transaction.support.TransactionSynchronizationManager;
  11. import org.springframework.util.StringUtils;
  12. import java.sql.Connection;
  13. import java.sql.Savepoint;
  14. import java.util.Properties;
  15. /**
  16. * @author JNPF开发平台组
  17. * @user N
  18. * @copyright 引迈信息技术有限公司
  19. * @date 2022/10/28 17:42
  20. */
  21. @Intercepts(
  22. {
  23. @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}),
  24. }
  25. )
  26. public class MyDynamicDataSourceAutoRollbackInterceptor implements Interceptor {
  27. @Override
  28. public Object intercept(Invocation invocation) throws Throwable {
  29. boolean hasTrans = TransactionSynchronizationManager.isActualTransactionActive();
  30. if (!hasTrans) {
  31. hasTrans = StringUtils.hasText(TransactionContext.getXID());
  32. }
  33. //Postgre Oracle Kingbase 连接报错后连接不可使用必须主动调用回滚才可以继续使用当前连接
  34. Savepoint savepoint = null;
  35. Connection connection = null;
  36. if(hasTrans){
  37. Executor executor = (Executor) invocation.getTarget();
  38. Connection conn = executor.getTransaction().getConnection();
  39. if(conn != null && !conn.getAutoCommit()){
  40. connection = ConnUtil.getRealConnection(conn);
  41. try {
  42. savepoint = connection.setSavepoint();
  43. }catch (Exception e){ }
  44. }
  45. }
  46. try {
  47. return invocation.proceed();
  48. } catch (Throwable e) {
  49. if(connection != null) {
  50. if (savepoint != null) {
  51. connection.rollback(savepoint);
  52. }else{
  53. connection.rollback();
  54. }
  55. }
  56. throw e;
  57. }
  58. }
  59. @Override
  60. public Object plugin(Object target) {
  61. return Interceptor.super.plugin(target);
  62. }
  63. @Override
  64. public void setProperties(Properties properties) {
  65. Interceptor.super.setProperties(properties);
  66. }
  67. }