`

事物tips

阅读更多

1、只读标志只在事务启动时应用。不启动任何事务,则只读标志被忽略。

2、关于只读标志很奇怪的一点是:要使用它,必须启动一个事务。如果只是读取数据,需要事务吗?答案是根本不需要。启动一个事务来执行只读操作会增加处理线程 的开销,并会导致数据库发生共享读取锁定(具体取决于使用的数据库类型和设置的隔离级别)。总的来说,在获取基于 JDBC 的 Java 持久性时,使用只读标志有点毫无意义,并会启动不必要的事务而增加额外的开销。

3、使用基于 ORM 的框架时,只读标志只是对数据库的一个提示,并且一条基于 ORM 框架的指令(如 Hibernate)将对象缓存的 flush 模式设置为 NEVER ,表示在这个工作单元中,该对象缓存不应与数据库同步。不过,REQUIRED 传播模式会覆盖所有这些内容,允许事务启动并工作,就好像没有设置只读标志一样。

4、总的来说,在使用基于 ORM 的框架时,只读标志基本上毫无用处,在大多数情况下会被忽略。但如果您坚持使用它,请记得将传播模式设置为 SUPPORTS ,这样就不会启动事务。

5、只有在被调用方法中的数据库操作需要保存到数据库中,而不管覆盖事务的结果如何时,才应该使用 REQUIRES_NEW 事务属性。比如,假设尝试的所有股票交易都必须被记录在一个审计数据库中。出于验证错误、资金不足或其他原因,不管交易是否失败,这条信息都需要被持久化。如果没有对审计方法使用 REQUIRES_NEW 属性,审计记录就会连同尝试执行的交易一起回滚。使用 REQUIRES_NEW 属性可以确保不管初始事务的结果如何,审计数据都会被保存。这里要注意的一点是,要始终使用 MANDATORYREQUIRED 属性,而不是 REQUIRES_NEW ,除非您有足够的理由来使用它,类似审计示例中的那些理由。

6、运行时异常(即非受控异常)自动强制执行整个逻辑工作单元的回滚,但受控异常不会。

7、所有公共读方法默认情况下都应使用事务属性 SUPPORTS 加以标记

8、只有事务所有者可以回滚事务

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics