Ich habe eine Frage in Bezug auf @Transactional Annotation. Nichts besonderes definiert, so wie ich es verstehe, ist PROPAGATION_REQUIRED Nehmen wir an, ich habe eine transaktionale Annotation, die auf Service-und Dao-Layer.Transaktional in beiden Service-und Dao-Schichten
Dienst
@Transactional
public long createStudentInDB(Student student) {
final long id = addStudentToDB (student);
addStudentToCourses (id, student.getCourseIds());
return id;
}
private long addStudentToDB (Student student) {
StudentEntity entity = new StudentEntity();
convertToEntity(student, entity);
try {
final id = dao.create(entity);
} catch (Exception e){
//
}
return id;
}
private void addStudentToCourses (long studentId, List<String> coursesIds){
//add user to group
if(coursesIds!= null){
List<StudentCourseEntity> studentCourses = new ArrayList<>();
for(String coursesId: coursesIds){
StudentCourseEntity entity = new StudentCourseEntity();
entity.setCourseId(coursesId);
entity.setStudentId(userId);
studentCourses.add(studentId);
}
anotherDao.saveAll(studentCourses);
}
}
DAO
@Transactional
public UUID create(StudentEntity entity) {
if (entity == null) { throw new Exception(//…); }
getCurrentSession().save(entity);
return entity.getId();
}
ANOTHERDAO
@Transactional
public void saveAll(Collection<StudentCourseEntity> studentCourses) {
List<StudentCourseEntity> result = new ArrayList<>();
if(studentCourses!= null) {
for (StudentCourseEntity studentCourse : studentCourses) {
if (studentCourse!= null) {
save(studentCourse);
}
}
}
}
Trotz der Tatsache, die nicht optimal ist, wie es scheint es Deadlocks verursacht. Angenommen, ich habe maximal 2 Verbindungen zur Datenbank. Und ich verwende 3 verschiedene Threads, um den gleichen Code auszuführen. Thread-1 und Thread-2 erhalten eine Verbindung, Thread-3 erhält keine Verbindung. Mehr als das, scheint Thread-1 stecken, wenn versucht wird, eine Verbindung in Dao-Ebene, das gleiche für Thread-2. Einen Deadlock verursachen.
Ich war mir sicher, dass dies mit propagation_required nicht passieren würde. Fehle ich etwas? Was ist die Empfehlung für so etwas? Gibt es eine Möglichkeit, @ transactional auf beiden Ebenen zu haben? Wenn nicht, was ist bevorzugt? Dank Fabrizio
Wenn Sie keine Verbindungen mehr haben, haben Sie entweder keine Transaktionen richtig eingerichtet oder sind mit Verbindungen selbst beschäftigt, anstatt Spring die Dinge verwalten zu lassen. Nur das Hinzufügen von Methodensignaturen ohne Implementierung hilft nicht bei der Lösung Ihres Problems. Überprüfen Sie zunächst Ihre Einrichtung (stellen Sie sicher, dass die tx-Einrichtung korrekt ist) und überprüfen Sie auch Ihre Implementierungen. –