当前位置: 首页 > news >正文

PHP套模板做网站/个人网站规划书模板

PHP套模板做网站,个人网站规划书模板,微商需要做网站吗,烘焙培训文章目录事务分类基于Aop实现编程式事务测试基于Aop实现spring声明式事务基于Spring AOP事务测试基于Aop实现类似Transactional注解1. 实现自定义注解2. 基于aop实现事务回滚提交3. 测试补充说明事务分类 编程式事务:在代码中显式调用beginTransaction()、commit()…

文章目录

    • 事务分类
    • 基于Aop实现编程式事务
    • 测试
    • 基于Aop实现spring声明式事务
      • 基于Spring AOP事务
      • 测试
    • 基于Aop实现类似@Transactional注解
      • 1. 实现自定义注解
      • 2. 基于aop实现事务回滚提交
      • 3. 测试
    • 补充说明

事务分类

  • 编程式事务:在代码中显式调用beginTransaction()、commit()、rollback()等事务管理相关的方法(自己手动控制事务)
  • 声明式事务:在方法头加入事务注解或者在xml配置开启编程式事务,简单来说就是把事务交由spring容器管理

基于Aop实现编程式事务

事务管理核心类: DataSourceTransactionManager或PlatformTransactionManager,这里使用DataSourceTransactionManager

TransactionUtils

@Component
@Scope("prototype")
//设置为原型,防止多线程操作引起的事务问题
public class TransactionUtils {@Autowiredprivate DataSourceTransactionManager dataSourceTransactionManager;//开启事务public TransactionStatus begin() {TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(new DefaultTransactionAttribute());return transactionStatus;}//提交事务public void commit(TransactionStatus transactionStatus) {dataSourceTransactionManager.commit(transactionStatus);}//回滚事务public void rollback(TransactionStatus transactionStatus) {dataSourceTransactionManager.rollback(transactionStatus);}
}

测试

@RunWith(SpringRunner.class)
@SpringBootTest(classes = MybatisApplication.class)
public class SpringbootTest {
@AutowiredTransactionUtils transactionUtils;@AutowiredUserDao userDao;@Testpublic void addUserTest() {TransactionStatus transactionStatus = null;try {User user = new User("12365987", "6666", "女", "小奏");//开启事务transactionStatus = transactionUtils.begin();userDao.addUser(user);//模拟发生异常int i = 1 / 0;//第二次插入数据库userDao.addUser(user);//提交事务transactionUtils.commit(transactionStatus);} catch (Exception e) {e.printStackTrace();//回滚事务if (transactionStatus != null) {transactionStatus.rollbackToSavepoint(transactionStatus);}}}
}

如果发生异常,事务会自动回滚,数据库不会插入数据

这手动开启事务的方法比较麻烦,必须每个方法自己手动开启事务

基于Aop实现spring声明式事务

基于Spring AOP事务

@Component
@Aspect
@Slf4j
public class AopTransaction {private static final String POINT_CUT = "execution(* com.mybatis.service.UserService.addUser(..))";//定义切面@Pointcut(POINT_CUT)private void pointcut(){}@AutowiredTransactionUtils transactionUtils;/*环绕通知* 方法执行前后执行** */@Around("pointcut()")public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {//调用方法之前log.info("开启事务");TransactionStatus transactionStatus = transactionUtils.begin();//代理调用方法proceedingJoinPoint.proceed();log.info("提交事务");transactionUtils.commit(transactionStatus);}//异常通知@AfterThrowing("pointcut()")public void afterTrowing() {log.info("回滚事务");//获取当前事务并回滚TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();}
}

UserServiceImpl

@Service("userService")
public class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;@Overridepublic void addUser(User user) {userDao.addUser(user);//模拟发生异常int i = 1/0;userDao.addUser(user);}
}

测试

UserController

@RestController
public class UserController {@AutowiredUserService userService;@GetMapping("/adduser")public void addUser() {User user = new User("12365987", "6666", "女", "小奏");userService.addUser(user);}
}

查看控制台及数据库
在这里插入图片描述
数据库也没有数据写入

基于Aop实现类似@Transactional注解

1. 实现自定义注解

WhTransaction

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface WhTransaction {
}
  • @Target说明了注解可使用的地方,Target有如下几个参数
  1. CONSTRUCTOR:用于描述构造器
  2. FIELD:用于描述域
  3. LOCAL_VARIABLE:用于描述局部变量
  4. METHOD:用于描述方法
  5. PACKAGE:用于描述包
  6. PARAMETER:用于描述参数
  7. TYPE:用于描述类、接口(包括注解类型) 或enum声明
  • @Retention作用是定义注解保留多久,RetentionPolicy.RUNTIME表示会在class字节码文件中存在,在运行时可以通过反射获取到

2. 基于aop实现事务回滚提交

AopTransaction

@Component
@Aspect
@Slf4j
public class AopTransaction {private static final String POINT_CUT = "execution(* com.mybatis.service..*.*(..))";//定义切面@Pointcut(POINT_CUT)private void pointcut(){}@AutowiredTransactionUtils transactionUtils;/*环绕通知* 方法执行前后执行** */@Around("pointcut()")public void around(ProceedingJoinPoint pjp) throws Throwable {//1.获取代理对象的方法//获取方法名称String methodName = pjp.getSignature().getName();//获取目标对象Class<?> classTarget = pjp.getTarget().getClass();//获取目标对象类型Class<?>[] par = ((MethodSignature) pjp.getSignature()).getParameterTypes();//获取目标对象方法Method objmethod = classTarget.getMethod(methodName, par);//2.获取该方法上是否加注解WhTransaction whTransaction = objmethod.getDeclaredAnnotation(WhTransaction.class);//3. 如果存在事务注解则开启事务TransactionStatus transactionStatus = null;if (whTransaction != null) {log.info("开启事务");transactionStatus = transactionUtils.begin();}//4. 调用目标代理对象方法pjp.proceed();//5. 判断该方法是否有注解if (whTransaction != null) {//6.如果存在注解,提交事务log.info("提交事务");transactionUtils.commit(transactionStatus);}}//异常通知@AfterThrowing("pointcut()")public void afterTrowing() {log.info("回滚事务");//获取当前事务并回滚TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();}
}

3. 测试

UserServiceImpl

@Service("userService")
public class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;@Override@WhTransactionpublic void addUser(User user) {userDao.addUser(user);//模拟发生异常int i = 1/0;userDao.addUser(user);}}

补充说明

  • 事务失效:spring事务是基于aop异常通知实现的,所以如果有有异常一定不能try,只能throws,不然异常通知就捕获不到,无法完成事务回滚
  • 这里实现spring事务没有考虑spring事务的传播行为
http://www.lbrq.cn/news/1473283.html

相关文章:

  • 做网站后台的叫什么/青岛推广优化
  • 成熟交bgmbgmbgm在线/太极seo
  • 黄石商城网站建设/网络游戏推广公司
  • 网站插件代码大全/可以推广赚钱的软件
  • 制作免费制作个人网站怎么做/西地那非片能延时多久每次吃多少
  • 做便民工具网站怎么样/seo优化文章网站
  • 青岛建立网站电话/宣传渠道有哪些
  • wap社区游戏入口/网站优化的意义
  • 做企业云网站的企业邮箱/seo搜索优化专员招聘
  • 产品网站开发计划表/百度推广怎么操作流程
  • 网站建设是属于b2/google付费推广
  • 中山建设局网站首页/怎么在百度免费推广
  • 深圳网站制作开发/上海广告推广
  • 怎么做网站底部版权信息/企业qq邮箱
  • 给别人做的网站要复杂做安全扫描/营销推广48个方法
  • 有没有做软件的外包网站/滁州网站seo
  • 怎么做营销网站/怎么seo关键词优化排名
  • 建设商务网站的经济可行性分析/市场营销四大基本策略
  • 制作网站网站/广州推广seo
  • 天津企业网站策划公司/适合网络营销的产品
  • 类似建E网模型网站建设/湖南网站seo推广
  • 哪家网站做推广好/百度获客平台
  • 自助下单网站怎么做/女教师遭网课入侵直播
  • 企业门户网站开发要多少钱/东莞优化排名公司
  • 专业做简历的网站/seo网站系统
  • 宜昌市住房和城乡建设官方网站/微信小程序开发教程
  • 建设网站有哪些/优化推广网站排名
  • 南通网站建设推广专家/网站建设推广公司
  • 个人网站起个名字/厦门站长优化工具
  • 网站建设的前期准备/谷歌浏览器下载安卓版
  • DoRA详解:从LoRA到权重分解的进化
  • 深入理解 Slab / Buddy 分配器与 MMU 映射机制
  • docker 安装elasticsearch
  • 关于MyBatis 的懒加载(Lazy Loading)机制
  • python | numpy小记(八):理解 NumPy 中的 `np.meshgrid`
  • 简单线性回归模型原理推导(最小二乘法)和案例解析