Я хочу на самом деле понять разницу между 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 и местом их использования.