Oracle 11g と一緒に grails 1.3.7 を使用し、内部トランザクションを管理しようとしています。いくつかの変更を行うトランザクション(Propagation.REQUIRED)サービス メソッドに渡される Bean Person があります。次に、別のトランザクション(propagation = Propagation.REQUIRES_NEW)メソッドに渡され、別の変更が加えられて例外がスローされます。私が期待していたのは、2 番目のサービスのすべての変更がロールバックされることですが、最初のサービスの変更はまだ有効です。これは状況です:
//outer transaction
class MyService {
def nestedService
@Transactional(propagation = Propagation.REQUIRED)
public void testRequiredWithError(Person person) {
person.name = 'Mark'
try {
nestedService.testRequiresNewWithError(person)
} catch (RuntimeException e) {
println person.age //this prints 15
println e
}
}
}//end MyService
//inner transaction
class NestedService{
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void testRequiresNewWithError(Person person) {
person.age = 15 //expected after Exception will be discarded
throw new RuntimeException("Rollback this transaction!")
}
}
次に、grails コンソールを実行し、終了後に DB を確認します。...
def p = Person.get(671)
def myService = ctx.myService
println p.name //'John'...from DB
println p.age //25...from DB
myService .testRequiredWithError(p)
println p.name // 'Mark'....correct
println p.age // 15....UNEXPECTED..
//same result checking on the DB after console ends and transaction flushes
Propagation.NESTED をブートストラップでアクティブ化した後transactionManager.setNestedTransactionAllowed(true)
、このポスト
grails トランザクション セット セーブポイントのようにセーブポイントを使用して使用しようとしました
が、それでも同じ結果が得られました。
何が欠けていますか????
前もって感謝します。