我有一个调用其他实用程序类的服务类。这些课本身有时
保存域对象并刷新它们(例如:new User(...).save(flush:true)
)。我正在通过测试调用我的服务类。
我的服务是否有交易?
从我在日志中看到的情况来看,冲洗模式总是在变化:
impl.SessionImpl setting flush mode to: MANUAL
hibernate.SQL select this_.id as i...
type.StringType binding '1rAdPVixha' to parameter
....
impl.SessionImpl setting flush mode to: AUTO
但我真正的问题是:如果我的服务方法在服务外部调用时是事务性的(例如:在测试中),我该如何强制服务回滚所有数据?
TransactionAspectSupport.currentTransactionInfo().transactionStatus.setRollbackOnly()
但是我仍然想知道我的服务是否完全是事务性的,即,即使我从我的服务方法中的实用程序类调用domain.save(flush:true),它也会在相同的tx背景。
像这样:
void testSomething() {
svc.process(data);
assert data.exists() ;// true if no rollback happened
}
class MySvc() {
void process(data) {
myUtil.process(data);
}
}
class MyUtil {
void process(data) { data.save(flush:true)}
}
答案 0 :(得分:3)
事务绑定到线程,并假设每个事务方法都具有默认的“required”传播设置,辅助调用将加入活动事务。启动调用将在完成时提交,除非某些内容触发回滚(运行时异常或显式调用)。
请记住,flush与commit不同。事务方法会在连接上将autocommit设置为false,因此刷新会将数据推送到数据库,但是如果需要回滚,它将保留在临时事务队列中。您可以多次刷新,例如,如果您正在执行许多插入并希望减少应用程序内存使用量。提交数据库时,将使临时更改成为永久更改。