我想真正了解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以及它们在何处使用之间的区别。