Spring處理交易管理的@Transactional
注釋可標註在類別(class)或方法(method)前,標注在類別的效果如下。
@Transactional
標註在類別上則該類別及子類別的所有public
方法都會套用@Transactional
,但非公開方法則不會套用,因為Spring @Transactional
是透過AOP的CGLIB代理(proxy)機制生成代理類別來達成交易管理,而CGLIB只對公開方法有效果。
例如下面在DemoService
類別加上@Transactional
。
DemoService
package com.abc.demo.service;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Transactional
@Service
public class DemoService {
public void addFoo() {
// ...
}
public void deleteFoo() {
// ...
}
private void modifyBar() {
// ...
}
}
效果相當於下面。
DemoService
package com.abc.demo.service;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class DemoService {
@Transactional
public void addFoo() {
// ...
}
@Transactional
public void deleteFoo() {
// ...
}
private void modifyBar() {
// ...
}
}
因為modifyBar()
是private
方法,所以不會套用@Transactional
。
若同時在類別及方法都標有@Transactional
,則方法的@Transactional
會覆寫(override)類別的@Transactional
效果。
沒有留言:
張貼留言