春季交易传播水平差异

时间:2019-03-03 11:55:23

标签: spring spring-boot spring-data-jpa spring-transactions

我想真正了解Propagation.NESTED与VS之间的区别 Propagation.REQUIRES_NEW ..我的要求是保存updateStudentupdateSchool并回退updateBus方法,在此我故意使运行时异常。因此,我使用了Propagation.NESTED并进行了测试,效果很好,但是无论是否使用Propagation.NESTED方法中的updateBus,结果都是相同的,因此NESTED的目的是什么。

另一方面,当我不使用updateStudentInner方法更改我的代码时,将回滚整个事务。所以在这里我不了解将事务级别保持在updateStudentInnerupdateStudentDetail

中的区别
@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以及它们在何处使用之间的区别。

0 个答案:

没有答案