1、只读标志只在事务启动时应用。不启动任何事务,则只读标志被忽略。
2、关于只读标志很奇怪的一点是:要使用它,必须启动一个事务。如果只是读取数据,需要事务吗?答案是根本不需要。启动一个事务来执行只读操作会增加处理线程 的开销,并会导致数据库发生共享读取锁定(具体取决于使用的数据库类型和设置的隔离级别)。总的来说,在获取基于 JDBC 的 Java 持久性时,使用只读标志有点毫无意义,并会启动不必要的事务而增加额外的开销。
3、使用基于 ORM 的框架时,只读标志只是对数据库的一个提示,并且一条基于 ORM 框架的指令(如 Hibernate)将对象缓存的 flush 模式设置为 NEVER
,表示在这个工作单元中,该对象缓存不应与数据库同步。不过,REQUIRED
传播模式会覆盖所有这些内容,允许事务启动并工作,就好像没有设置只读标志一样。
4、总的来说,在使用基于 ORM 的框架时,只读标志基本上毫无用处,在大多数情况下会被忽略。但如果您坚持使用它,请记得将传播模式设置为 SUPPORTS
,这样就不会启动事务。
5、只有在被调用方法中的数据库操作需要保存到数据库中,而不管覆盖事务的结果如何时,才应该使用 REQUIRES_NEW
事务属性。比如,假设尝试的所有股票交易都必须被记录在一个审计数据库中。出于验证错误、资金不足或其他原因,不管交易是否失败,这条信息都需要被持久化。如果没有对审计方法使用 REQUIRES_NEW
属性,审计记录就会连同尝试执行的交易一起回滚。使用 REQUIRES_NEW
属性可以确保不管初始事务的结果如何,审计数据都会被保存。这里要注意的一点是,要始终使用 MANDATORY
或 REQUIRED
属性,而不是 REQUIRES_NEW
,除非您有足够的理由来使用它,类似审计示例中的那些理由。
6、运行时异常(即非受控异常)自动强制执行整个逻辑工作单元的回滚,但受控异常不会。
7、所有公共读方法默认情况下都应使用事务属性 SUPPORTS
加以标记
8、只有事务所有者可以回滚事务
- Java Transaction Design Strategies (Mark Richards,C4Media 出版,2006):本书深入讨论了 Java 平台中的事务。
- Java Transaction Processing (Mark Little,Prentice Hall,2004):本书是另一本比较好的关于事务的参考书。