@Transaction如何在interpeped方法中工作

时间:2014-05-14 13:16:19

标签: java transactions

在我的服务中我有方法:

@Transactional
public void doSomething(String dbName) {

}

我的拦截器拦截了这个方法:

@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
    // do something
    return invocation.proceed();
}

我的问题是交易中的内容。只是代码在我的服务中或在我的拦截器中?

1 个答案:

答案 0 :(得分:0)

这真的取决于。仅当您使用@Transactional定义spring以使用事务(如果使用XML进行配置)并且拦截器使用spring创建的bean时,使用<tx:annotation-driven/>才会打开事务。

如果你不使用spring bean,@Transactional注释没有任何意义,也不会做任何事情,因为spring创建了一个原始类的包装器/代理,用于管理事务。

您可以查看运行doSomething()的类的实例,看看它是否只包含您的私有字段,还是还有其他事务数据。还要看一下类的类型 - 如果它是事务性的,它将显示一个名称,表明它是一个包装器,而不是你原来的类名。

交易本身仅在doSomething()附近运行。这意味着当您输入doSomething()时,会打开一个事务,并在doSomething()完成时结束。

除非invoke()电话也在交易中。如果invoke()在一个事务中,`doSomething()将在同一个事务中运行,并且不会打开一个新事务(意味着它们一起失败或成功)。