Разница в уровне распространения транзакций Spring - PullRequest
0 голосов
/ 03 марта 2019

Я хочу на самом деле понять разницу между Propagation.NESTED VS Propagation.REQUIRES_NEW .. Мое требование - сохранить updateStudent и updateSchool и откатить метод updateBus, где я специально сделал исключение времени выполнения.поэтому я использовал Propagation.NESTED и протестировал, который работает нормально, но результат одинаков с или без Propagation.NESTED в updateBus методе, так какова цель NESTED здесь.

С другой стороны, когда я изменяю свой код без метода updateStudentInner, вся транзакция откатывается назад.Так что здесь я не понимаю разницу в поддержании транзакционного уровня в updateStudentInner против updateStudentDetail

@Transactional(propagation = Propagation.REQUIRES_NEW)              
public void updateStudentDetail(String name, int id) { 
updateStudent(name,id); 
updateSchool(name, id); 
updateBus(name, id);
}

Вот весь код для этого

package com.example.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service
public class ExampleDaoImpl {

    @Autowired
    JdbcTemplate jdbcTemplate;


    public void updateStudentDetail(String name, int id) {
            updateStudentInner(name, id);
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void updateStudentInner(String name, int id) {
        updateStudent(name, id);
        updateSchool(name, id);
        updateBus(name, id);
    }

    public void updateStudent(String name, int id) {
        String query = "UPDATE STUDENT SET NAME=? WHERE ID=?";
        name = "Name " + name;
        int i = jdbcTemplate.update(query, name, id);
        System.out.println("i updateStudent-->" + i);
    }

    public void updateSchool(String name, int id) {
        name = "School " + name;
        String query = "UPDATE SCHOOL SET NAME=? WHERE ID=?";
        int i = jdbcTemplate.update(query, name, id);
        System.out.println("i updateSchool-->" + i);

    }

    @Transactional(propagation = Propagation.NESTED)
    public void updateBus(String name, int id) {

        name = "Bus " + name;
        String query = "UPDATE BUS SET AME=? WHERE ID=?";
        int i = jdbcTemplate.update(query, name, id);
        System.out.println("i updateBUs-->" + i);

    }
}

Также это будетЛучше, если кто-нибудь объяснит на примере реального времени разницу между REQUIRE_NEW, REQUIRED, NESTED и местом их использования.

...