对设置@transactional的值感到困惑

时间:2013-09-27 17:12:10

标签: java spring transactional

有人可以解释一下,当我将readOnly值设为true时,以及将false@Transactional一起使用时,我应该将其设为{{1}}吗?

3 个答案:

答案 0 :(得分:4)

当您只是从数据库中读取/选择而不是更改任何数据时 - 通过执行更新/插入/删除。

如果你可以指定readOnly,那么你的资源就要少得多。

答案 1 :(得分:2)

定义非常简单:当且仅当您确保不进行更新时,您可以使用readonly=true,在事务内部执行插入或删除操作。 如果支持,这将优化dbms的锁定行为。

readonly默认为false。

最好的问候,

SAM

修改

/**
 * {@code true} if the transaction is read-only.
 * Defaults to {@code false}.
 * <p>This just serves as a hint for the actual transaction subsystem;
 * it will <i>not necessarily</i> cause failure of write access attempts.
 * A transaction manager which cannot interpret the read-only hint will
 * <i>not</i> throw an exception when asked for a read-only transaction.
 * @see org.springframework.transaction.interceptor.TransactionAttribute#isReadOnly()
 */
boolean readOnly() default false;

答案 2 :(得分:1)

自定义隔离级别,可以为事务添加更多控制权。

如果您知道方法是只读的,则应指定它。

对于readonly = true,您要向事务管理器说一个特定方法只能从DB读取。这有两个好处:

首先,它可以比其他更快,因为它允许DBMS优化事务(如果支持)。 其次,它可以避免死锁问题(例如,当特定表被写入锁定时),因为您确保该方法不会执行INSERT或UPDATE。

但是,在这里您可以找到有关它的所有详细信息: http://docs.spring.io/spring/docs/2.5.x/reference/transaction.html