JPA中的线程与交易之间的关系是什么?
我知道,如果未使用@transactional
注释明确指定隔离级别,则JPA可与数据库设置的默认隔离级别设置。 因此,对于简单的JPA查询,例如FindbyId(SomeID)
,交易限于JPA查询,还是在整个请求线程中适用交易?
如果我在同一线程中两次执行findbyId()
方法,它是否在同一事务中执行?
I am aware that JPA works with the default isolation level set for the database , if no isolation level is explicitly specified using the @Transactional
annotation.
So, for a simple JPA query like findByID(someId)
, is the transaction limited to the JPA query, or the transaction is applicable throughout the request thread ?
If I execute findById()
method twice in the same thread, does it execute within the same transaction ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果您不使用注释或程序化事务指定交易边界,则每个查询在其自身交易中执行。
jpa在交易提交之前冲洗,因此每个FindbyId都会进行自己的数据库查询,然后刷新缓存的结果。因此,如果您两次致电Findbyid,则会引起两个查询。
您可以通过查看交易记录来验证这一点,请参见显示log 。
隔离水平与交易边界不同。大多数交易属性(酸中的A,C和D)都是全有或全无的,但隔离不是,可以向上或向下拨打。隔离水平决定了一项交易的变化如何在进行的其他交易中可见。
If you don't specify transaction boundaries with annotations or programmatic transactions then each query executes in its own transaction.
JPA flushes before the transaction commits, so each findById will make its own database query, then flush the cached results. So if you call findById twice it will result in two queries.
You can verify this by viewing logging of transactions, see Showing a Spring Transaction in log.
Isolation level is a different issue from transaction boundaries. Most transaction properties (the A, C, and D in ACID) are all-or-nothing, but isolation isn't, it can be dialed up or down. Isolation level determines how changes in one transaction become visible to other transactions in progress.