網頁

2020/8/29

Spring @Transactional 標註在類別的效果

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效果。


沒有留言:

張貼留言