【发布时间】:2014-09-20 14:08:22
【问题描述】:
我从著名的书 - Mastering Enterprise JavaBeans™ 3.0 中提取以下几行。
并发访问和锁定:对数据库中数据的并发访问始终受到事务隔离的保护,因此您无需设计额外的并发控制来保护您的 如果事务使用得当,应用程序中的数据。除非您做出具体规定,否则您的实体将受到容器管理事务的保护,这些事务使用为持久性提供程序和/或 EJB 容器的事务服务配置的隔离级别。但是,了解应用程序的并发控制要求和语义很重要。
然后谈到Java Transaction API、Container Managed 和Bean Managed Transaction、不同的TransactionAttributes、不同的隔离级别。它还指出 -
Java Persistence 规范定义了两个重要的特性 针对同时访问的实体进行了调整: 1.使用版本属性的乐观锁 2.显式读写锁
好的 - 我阅读了所有内容并很好地理解了它们。但问题是在哪种情况下我需要使用所有这些技术?如果我使用 Container Managed transaction 并且它为我做了所有事情,为什么我需要关心所有这些细节?我知道 TransactionAttributes (REQUIRED, REQUIRES_NEW) 的重要性并且知道在哪些情况下我需要使用它们,但是其他的呢?更具体地说-
- 为什么需要 Bean 托管事务?
- 为什么我们需要实体类的读写锁?
- 为什么我们需要版本属性?
对于第二季度和第三季度——我认为实体类不是线程安全的,因此我们需要在那里锁定。但是数据库是由 JTA API 在 EJB 类中管理的(如第一段所述),那么为什么我们需要单独管理 Entity 类呢?我知道 Lock 和 Version 如何工作以及为什么需要它们。但是既然 JTA 已经存在,为什么他们会出现呢?
你能回答他们吗?如果您给我一些网址,我们将不胜感激。
非常感谢。
【问题讨论】:
-
深思 -> 您将如何设计一个可以在应用程序级别维护 ACID 属性的事务管理系统?例如:文件系统的事务管理系统
-
感谢 Satadru 的思考。我将阅读更多书籍以澄清我的疑问。再次感谢。
标签: java multithreading hibernate concurrency transactions