只读事务上下文

介绍

长话短说,您不应在并行流中使用事务。 这是因为并行流中的每个线程都有其自己的名称,因此它确实参与了事务。

Streams API旨在在某些准则下正常工作。 实际上,为了受益于并行性,不允许每个操作更改共享对象的状态(此类操作称为无副作用)。 如果您遵循此准则,并行流的内部实现将巧妙地拆分数据,将不同部分分配给独立线程,并合并最终结果。

这主要是由于实现事务的方式而产生的。 在某种程度上,ThreadLocal变量用于标记参与事务的每个方法。 ThreadLocal变量无法将其变量保持在并行流中。 为了证明我已经创建了以下测试

 import org.junit.Assert;  import org.junit.Test;  import java.util.concurrent.atomic.AtomicBoolean;  import java.util.stream.IntStream;  public class ThreadNameTest { @Test public void threadLocalTest(){ ThreadContext.set( "MAIN" ); AtomicBoolean hasNamechanged = new AtomicBoolean( false ); IntStream.range( 0 , 10000000 ).boxed().parallel().forEach(n->{ if (! "MAIN" .equals(ThreadContext.get())){ hasNamechanged.set( true ); } }); Assert.assertTrue(hasNamechanged.get()); } private static class ThreadContext { private static ThreadLocal<String> val = ThreadLocal.withInitial(() -> "empty" ); public ThreadContext() { } public static String get() { return val.get(); } public static void set(String x) { ThreadContext.val.set(x); } }  } 

IntStream.range值越高,则测试成功的可能性就越大。

现在看看这个github项目https://github.com/diakogiannis/transactionplayground/

TransactionPlayground项目

我创建了一种以4种不同方式加载猫的服务

  1. 按顺序curl -I -X GET http://localhost:8080/api/cats/all
  2. 顺序但抛出异常以创建回退标记curl -I -X GET http://localhost:8080/api/cats/all-exception
  3. 在并行curl -I -X GET http://localhost:8080/api/cats/all-parallel
  4. 并行但抛出异常以创建回滚标记curl -I -X GET http://localhost:8080/api/cats/all-parallel-exception

也有2个辅助呼叫

  1. 清理curl -I -X DELETE http://localhost:8080/api/cats/
  2. 和一个实际查看猫的curl -X GET http://localhost:8080/api/cats/

开始项目

请执行mvn clean package wildfly-swarm:run

正常订购

呼叫curl -I -X GET http://localhost:8080/api/cats/all ,然后curl -X GET http://localhost:8080/api/cats/

正常,无订单,又称平行

调用clean curl -I -X DELETE http://localhost:8080/api/cats/调用curl -I -X GET http://localhost:8080/api/cats/all-parallel然后curl -X GET http://localhost:8080/api/cats/

预期的结果是看到猫的清单。 无需订购。 这就是为什么并行流先到先服务并从列表中随机读取的原因。

正常,例外

调用clean curl -I -X DELETE http://localhost:8080/api/cats/调用curl -I -X GET http://localhost:8080/api/cats/all-exception然后curl -X GET http://localhost:8080/api/cats/

预期的结果是一个空列表。 这是因为该事务被标记为回滚,所以jdbc事务也被回滚,因此所有条目都没有按照ACID模型持久化到数据库中。

平行例外

调用clean curl -I -X DELETE http://localhost:8080/api/cats/调用curl -I -X GET http://localhost:8080/api/cats/all-parallel-exception然后curl -X GET http://localhost:8080/api/cats/

预期的结果不是一个空列表。 这是因为并行流中的每个线程都会打开自己的jdbc事务,并在完成后进行提交。 因此,每次执行此操作时,都会显示一些猫,直到出现异常并停止执行。 回滚仅在一个线程中进行。

翻译自: https://www.javacodegeeks.com/2019/09/should-parallel-streams-transaction-context.html

只读事务上下文

只读事务上下文_我可以/应该在事务上下文中使用并行流吗?相关推荐

  1. 同事操作两个数据源保持事务一致_终于有人把分布式事务说清楚了

    前言 这篇文章将给大家介绍一下对分布式事务的一些见解,并讲解分布式事务处理框架 TX-LCN 的执行原理,错误之处望各位不吝指正. 1. 什么情况下需要使用分布式事务? 使用的场景很多,先举一个常见的 ...

  2. 银行转账java代码事务实现_转账操作代码实现----事务

    在进行转账操作时,我们要保证数据的统一性.(例如,当一个账户转出金额过程中,如果出现系统错误或者说是停电断网等特殊情况,将会发生转出账户减少,转入账户金额未添加的情况.)因此,我们需要通过事务控制: ...

  3. 我可以/应该在事务上下文中使用并行流吗?

    介绍 长话短说,您不应在并行流中使用事务. 这是因为并行流中的每个线程都有其自己的名称,因此它确实参与了事务. Streams API旨在在某些准则下正常工作. 实际上,为了受益于并行性,不允许每个操 ...

  4. mysql 查询事务信息_查看MySQL最近的事务执行信息

    查看MySQL最近的事务执行信息 发布时间:2020-03-03 12:35:07 来源:51CTO 阅读:103 作者:wjw555 课题:查看MySQL最近的事务执行信息 *虽然我们可以通过查询慢 ...

  5. tp5模型能实现事务吗_实现工作单元-通过事务模型处理域对象

    tp5模型能实现事务吗 Even in the most basic scenario you can picture, where the logic of an application's cor ...

  6. java foreach多线程_详解多线程入门案例与java8的并行流

    进程与线程 进程是所有线程的集合,每一个线程是进程中的一条执行路径. 多线程的创建方式,继承Thread实现Runable /*** 第一种创建线程的方式,继承Thread*/ public clas ...

  7. spring的事务隔离_再深一点:面试工作两不误,源码级理解Spring事务

    原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处. Spring有5种隔离级别,7种传播行为.这是面试常问的内容,也是代码中经常碰到的知识点.这些知识枯燥而且乏味,其中有些非 ...

  8. 什么是事务的传播_这么漂亮的Spring事务管理详解,你不来看看?

    事务概念回顾 什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行. 事物的特性(ACID): 原子性: 事务是最小的执行单位,不允许分割.事务的原子性确保动作要么全部完成,要么完全不起作用 ...

  9. 不同类的方法 事务问题_深入理解 Spring 事务原理

    Spring事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的.对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 获 ...

最新文章

  1. 好消息,Blackberry开发文档发布。
  2. 数据库激荡 40 年,深入解析 PostgreSQL、NewSQL 演进历程
  3. ad 卡尔曼_卡尔曼滤波算法C语言实现(转2)
  4. Matplotlib 中文用户指南 3.7 变换教程
  5. minigui大号字体的实现,即ttf库的使用【转】
  6. 2021年6月Python小屋编程比赛获奖名单
  7. C# .net Static 干什么的
  8. java文字水印模糊_Java添加文字水印和图片水印
  9. 2022年更新正大杯获得国家二等奖经验优秀报告资料分享全国大学生市场调查与分析大赛市调大赛保研竞赛加分怎么找队友等全套经验分享
  10. 昨天与友人聊的二三观点
  11. 基本流水线与记分牌算法和Tomasulo算法
  12. 做网站要服务器和什么软件,做网站的软件有哪些,自己建网站要用到哪些软件?...
  13. 线性回归实战---Abalone鲍鱼年龄预测
  14. 用python画星空的代码_用python画星空源代码是什么?_后端开发
  15. 从ADK的WinPE自己手动构建自己的PE
  16. python一键安装框架_《自拍教程76》Python 一键批量安装第三方包
  17. java状态机(订单状态控制)
  18. 资深数据科学家教你如何在求职过程中找到心仪工作
  19. “贵系万花筒”:探秘清华计算机系背后的“酒井”文化
  20. 计算机文化基础授课计划,计算机文化基础授课计划表

热门文章

  1. E - Counting Cliques HDU - 5952
  2. P1064 [NOIP2006 提高组] 金明的预算方案
  3. HAPPY_TOGETHER_WEEK15_ENJOY
  4. Shift and Reverse
  5. 2020牛客国庆集训派对day4 Jokewithpermutation
  6. 模板:拓展kmp(Z函数)
  7. CodeForces: 360(div1)361(div2)
  8. nssl1176-轨道【数论,Dp】
  9. ssl2344P2835-刻录光盘【Floyd,联通块数,图论】
  10. HDU6038 - Function