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

网络商城网站怎样做关键词优化sem竞价外包公司

网络商城网站怎样做关键词优化,sem竞价外包公司,淄川政府网站建设托管,长春网站开发报价SpringBoot多线程,保证各个子线程和主线程事物一致性 1、第一种写法1.1、TransactionalUntil工具类1.2、service业务类 2、第二种写法2.1、service业务类 1、第一种写法 1.1、TransactionalUntil工具类 import org.springframework.jdbc.datasource.DataSourceTra…

SpringBoot多线程,保证各个子线程和主线程事物一致性

  • 1、第一种写法
    • 1.1、TransactionalUntil工具类
    • 1.2、service业务类
  • 2、第二种写法
    • 2.1、service业务类

1、第一种写法

1.1、TransactionalUntil工具类

import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Component;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.interceptor.DefaultTransactionAttribute;import javax.annotation.Resource;@Component
public class TransactionalUntil {@Resourceprivate DataSourceTransactionManager dataSourceTransactionManager;/*** 开启事务*/public TransactionStatus begin() {TransactionStatus transaction = dataSourceTransactionManager.getTransaction(new DefaultTransactionAttribute());return transaction;}/*** 提交事务*/public void commit(TransactionStatus transactionStatus) {dataSourceTransactionManager.commit(transactionStatus);}/*** 回滚事务*/public void rollback(TransactionStatus transactionStatus) {dataSourceTransactionManager.rollback(transactionStatus);}}

1.2、service业务类

其实主要就是用CountDownLatch类的特性,和手动提交事物,来保证主线程和子线程事物的一致性。

    @Resourceprivate TransactionalUntil transactionalUntil;private volatile Boolean is_ok = new Boolean(true);@Transactional@Overridepublic void trs1() throws Exception{// 监控子线程数据CountDownLatch childMonitor = new CountDownLatch(2);// 主线程收集子线程运行最终结果List<Boolean> childResponse = new CopyOnWriteArrayList<>();//子线程在该对象上等待主线程的通知CountDownLatch mainMonitor = new CountDownLatch(1);//业务代码查询,可以换成自己的业务场景ResVmCustom resVmCustom1 = resVmCustomMapper.selectById(1);resVmCustom1.setCpu(3);resVmCustomMapper.updateById(resVmCustom1);CompletableFuture.runAsync(() -> {TransactionStatus transactionStatus = transactionalUntil.begin();try {ResVmCustom resVmCustom2 = resVmCustomMapper.selectById(2);resVmCustom2.setCpu(3);//Db.saveOrUpdate(resVmCustom2);resVmCustomMapper.updateById(resVmCustom2);childResponse.add(Boolean.TRUE);childMonitor.countDown();mainMonitor.await();if (is_ok) {// 事务提交log.info("线程  {} 正常执行,线程事务提交", Thread.currentThread().getName());transactionalUntil.commit(transactionStatus);} else {// 事务回滚log.info("线程   {} 执行出现异常,线程事务回滚", Thread.currentThread().getName());transactionalUntil.rollback(transactionStatus);}} catch (Exception e) {// 提交失败log.info("线程   {} 执行出现异常", Thread.currentThread().getName());childMonitor.countDown();childResponse.add(Boolean.FALSE);transactionalUntil.rollback(transactionStatus);}});CompletableFuture.runAsync(() -> {TransactionStatus transactionStatus = transactionalUntil.begin();try {ResVmCustom resVmCustom3 = resVmCustomMapper.selectById(3);resVmCustom3.setCpu(3);resVmCustomMapper.updateById(resVmCustom3);childResponse.add(Boolean.TRUE);childMonitor.countDown();mainMonitor.await();if (is_ok) {// 事务提交log.info("线程  {} 正常执行,线程事务提交", Thread.currentThread().getName());transactionalUntil.commit(transactionStatus);} else {// 事务回滚log.info("线程   {} 执行出现异常,线程事务回滚", Thread.currentThread().getName());transactionalUntil.rollback(transactionStatus);}} catch (Exception e) {// 提交失败log.info("线程   {} 执行出现异常", Thread.currentThread().getName());childMonitor.countDown();childResponse.add(Boolean.FALSE);transactionalUntil.rollback(transactionStatus);}});childMonitor.await();for (Boolean res : childResponse) {while (!res) {// 如果有一个子线程只想失败,改变mainResult状态 事务回滚log.info("有线程执行失败,修改标识位,事务回滚");is_ok = false;break;}}//主线程获取结果,子线程根据主线程的结果 提交或回滚mainMonitor.countDown();/*** 下面这句话,保证了主线程和子线程一致* 如果不想主线程和子线程事物保持一致,注释下面这句话就行*/if (!is_ok) {throw new RuntimeException();}}

2、第二种写法

2.1、service业务类

TransactionalUntil 工具类还用和上面的一样就行…

    /*** SpringBoot默认的自己的线程池*/@Resourceprivate ThreadPoolTaskExecutor executor;@Transactional@Overridepublic void trs2() throws Exception {// 假设三个线程要执行// 监控子线程数据CountDownLatch childMonitor = new CountDownLatch(3);// 主线程收集子线程运行最终结果List<Boolean> childResponse = new CopyOnWriteArrayList<>();//子线程在该对象上等待主线程的通知CountDownLatch mainMonitor = new CountDownLatch(1);for (int i = 1; i <= 3; i++) {int finalI = i;executor.execute(() -> {TransactionStatus transactionStatus = transactionalUntil.begin();try {//数据库增删改操作//此时只是用线程的个数i,当成业务的主键id,你自己重新声明其他变量来替代主键业务ID也行ResVmCustom resVmCustom = resVmCustomMapper.selectById(finalI);resVmCustom.setCpu(3);resVmCustomMapper.updateById(resVmCustom);childResponse.add(Boolean.TRUE);childMonitor.countDown();mainMonitor.await();if (is_ok) {// 事务提交log.info("线程  {} 正常执行,线程事务提交", Thread.currentThread().getName());transactionalUntil.commit(transactionStatus);} else {// 事务回滚log.info("线程   {} 执行出现异常,线程事务回滚", Thread.currentThread().getName());transactionalUntil.rollback(transactionStatus);}} catch (Exception e) {// 提交失败log.info("线程   {} 执行出现异常", Thread.currentThread().getName());childMonitor.countDown();childResponse.add(Boolean.FALSE);transactionalUntil.rollback(transactionStatus);}});}childMonitor.await();for (Boolean res : childResponse) {while (!res) {// 如果有一个子线程只想失败,改变mainResult状态 事务回滚log.info("有线程执行失败,修改标识位,事务回滚");is_ok = false;break;}}is_ok = false;//主线程获取结果,子线程根据主线程的结果 提交或回滚mainMonitor.countDown();/*** 下面这句话,保证了主线程和子线程一致* 如果不想主线程和子线程事物保持一致,注释下面这句话就行*/if (!is_ok) {throw new RuntimeException();}}
http://www.dtcms.com/wzjs/4088.html

相关文章:

  • 橙云的主机支持放两个网站吗百度账号登录个人中心
  • wordpress模板更改seo的内容怎么优化
  • 个人是否可以申请网址什么是搜索引擎优化seo
  • 凡科网站备案网站快照优化公司
  • php做网站教程网络营销首先要
  • 百度网页怎么设置青少年模式优化大师的优化项目有哪7个
  • 做网站字体网站建设流程图
  • 班级网站建设的内容查找网站
  • 最专业的医疗网站建设北京百度推广公司
  • 做的做的比较好的网站百度搜索引擎优化指南最新版
  • 医疗网站建设市场北京口碑最好的it培训机构
  • 太原网站的优化建站seo推广
  • 美女做羞羞的网站2023年新闻小学生摘抄
  • 江苏高校品牌专业建设工程网站最新网络营销方式有哪些
  • 福州网站建设安卓优化大师下载安装
  • 甜品网站建设方案自己怎么优化网站
  • 网站域名.xin百度seo入驻
  • 做医疗网站建设友情链接什么意思
  • 怎么做产品的网站五合一网站建设
  • 电子政务建设与政府网站建设电商运营
  • 域名已有服务器也有怎么做网站谷歌搜索广告优化
  • 品牌企业建站宁波seo排名方案优化公司
  • wordpress 搬站热狗seo优化外包
  • 使用vue做商城网站项目难点百度关键词排名用什么软件
  • 企业网站建设费用计入什么科目chatgpt中文在线
  • wordpress如何更改页脚背景颜色网站seo推广多少钱
  • 大连网站搜索排名免费seo网站优化工具
  • 相城区建设局网站地推项目对接平台
  • 福田网站制作报价谷歌seo优化
  • 宝鸡做网站的公司宁波seo托管公司