在我的服务中我有方法:
@Transactional
public void doSomething(String dbName) {
}
我的拦截器拦截了这个方法:
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
// do something
return invocation.proceed();
}
我的问题是交易中的内容。只是代码在我的服务中或在我的拦截器中?
答案 0 :(得分:0)
这真的取决于。仅当您使用@Transactional
定义spring以使用事务(如果使用XML进行配置)并且拦截器使用spring创建的bean时,使用<tx:annotation-driven/>
才会打开事务。
如果你不使用spring bean,@Transactional
注释没有任何意义,也不会做任何事情,因为spring创建了一个原始类的包装器/代理,用于管理事务。
您可以查看运行doSomething()
的类的实例,看看它是否只包含您的私有字段,还是还有其他事务数据。还要看一下类的类型 - 如果它是事务性的,它将显示一个名称,表明它是一个包装器,而不是你原来的类名。
交易本身仅在doSomething()
附近运行。这意味着当您输入doSomething()
时,会打开一个事务,并在doSomething()
完成时结束。
除非invoke()
电话也在交易中。如果invoke()
在一个事务中,`doSomething()将在同一个事务中运行,并且不会打开一个新事务(意味着它们一起失败或成功)。