当前位置: 首页 > 知识库问答 >
问题:

JPAPESSIMISTIC_WRITE在同步读取流中的使用

咸星波
2023-03-14

我正面临这样一种情况:

Time T0: Transaction 1 -> Read integer from DB 
Time T1: Transaction 2 -> Read integer from DB 
Time T2: Transaction 1 -> Increment, Write and Commit to DB 
Time T3: Transaction 2 -> Increment, Write and Commit to DB 

现在,由于两个事务读取的是相同的整数值,因此此流会导致不正确的增量。

那么JPA实现中的悲观_写锁(Hibernate是我最感兴趣的一个)能防止这种流动吗?

该流是否属于脏读、不可重复读或幻象读的任何类别
在我看来不是因为

    事务
  1. 2 在事务 1 写入(修改)之前读取数据,因此它不是脏读取
  2. 此处的事务中不会发生多次读取,因此不是不可重复读取或幻像读取的情况

共有1个答案

江烨伟
2023-03-14

我假设T1和T2在不同的线程中执行。使用JPA实现这一点很复杂,但并非不可能。

您必须使用“悲观写锁”读取事务T1和T2中的整数。这样,T2被延迟,直到T1完成,并且递增的值将被读取。

该类别为“不可重复读取”。在 T1 中保存递增的值后,T2 的第二次读数可能会返回新值。但。。。这种情况只剩下很少的DBMS,因为大多数DBMS,如Oracle,MySQL,Postgres都提供MVCC,因此通常确保其他事务中的更改延迟到第一个IST完成。

但是在其他DBMS中,如果您使用隔离级别“可重复读取”,一条记录在读取过程中总是被锁定,以确保它不能被更改。因此,T2不会在T1完成之前传递整数。但是请注意,在MVCC-DBMS中,“可重复读取”可以在没有锁的情况下实现,因此隔离级别不会有帮助。

 类似资料:
  • 问题内容: 我一直在这样做,以便在Linux下同步读取整个stdin数据: 由于没有/ dev / stdin文件,因此这显然在Windows上不起作用。我该怎么做才能达到同样的目的? 问题答案: readline-sync模块可以很好地完成这项工作。 然后: https://www.npmjs.com/package/readline- sync

  • 我想读取一个文件,并使用FileReader对象将其转换为base64编码的字符串。以下是我使用的代码: 但是在这种情况下,我在事件处理程序(onLoadend事件)中得到转换的结果。我想要一个同步方法。有没有办法"readAsDataURL"方法可以直接返回'result_base64'变量的值?

  • 问题内容: 我已经阅读了这个问题,但并不能完全回答我的问题。不幸的是,自从我上次查看AJAX以来,XHR对象中的一切似乎已经发生了变化,因此不再可能在完成填充之前直接访问它。 我必须编写一个页面,该页面使用AJAX(最好是jQuery,但我愿意接受建议)从无法控制的服务器通过HTTP检索CSV数据。响应数据可能会很大;一兆字节的文本并不罕见。 服务器是流友好的。在直接从JavaScript返回数据

  • 本文向大家介绍Node.js 使用流实现读写同步边读边写功能,包括了Node.js 使用流实现读写同步边读边写功能的使用技巧和注意事项,需要的朋友参考一下 废话不多说了,直接给大家贴代码了,具体代码如下所示: 上面这种写法比较繁琐,大家看完后,忘记就行 node.js提供给我们内置方法pipe 直接将读取的流操作到写入流中,还是异步操作 总结 以上所述是小编给大家介绍的Node.js 使用流实现读

  • 我对同步块有一些疑问。在提问之前,我想分享另一个相关帖子链接的答案,以回答相关问题。我引用彼得·劳里的同一个答案。 > <块引号> 同步确保您对数据有一致的视图。这意味着您将读取最新值,其他缓存将获得最新值。缓存足够智能,可以通过特殊总线相互通信(JLS不需要,但允许)该总线意味着它不必触摸主存储器即可获得一致的视图。 如果您只使用同步,则不需要Volatile。如果您有一个非常简单的操作,而同步

  • 嗨,我需要一些帮助/指导,因为我在研究中遇到了困难。 问题是: 如何在API(通过编程)或控制台版本中使用gstream er或avlib(ffmpeg)转换RTP数据。 数据 我有来自TCP上RTP/RTCP的RTP转储,因此我可以获得文件中每个RTP数据包的精确启动和停止。这是一个H264视频流转储。数据采用这种方式,因为我需要通过libcurl获取RTCP/RTP交织流(我目前正在这样做)