Spring Transactional의 전파 특성/격리 수준

2562 단어
1: 격리 수준
프로젝트에 사용된 데이터베이스는 mysql이고 기본 격리 단계는 REPEATABLE_READ 중복 읽기입니다. pgsql과oracle 기본 격리 단계READ_COMMITTED 아래는spring의 다섯 가지 격리 단계입니다. 기본은 데이터베이스를 사용하는 유형과 같습니다.
    DEFAULT(-1),
    READ_UNCOMMITTED(1),
    READ_COMMITTED(2),
    REPEATABLE_READ(4),
    SERIALIZABLE(8);
public class A{
     @Transactional(isolation = Isolation.SERIALIZABLE)
     public void methodA() {
          userMapper.insert();
     }

      public void methodB() {
          userMapper.insert()
     }

실행 방법methodA를 실행할 때,methodB의 인터페이스에서select를 사용하면 데이터를 찾을 수 있지만,user표에 대응하는dd/update/delete는 기다리고 있어서 실행할 수 없습니다.이것이 바로 직렬 실행의 격리 단계입니다.
public class A{
     @Transactional(isolation = Isolation.SERIALIZABLE)
     public void methodA() {
          userMapper.insert()
          methodB();
     }

      public void methodB() {
          userMapper.insert()
     }

같은 클래스에서 실행할 수 있습니다.
public class A{
     @Transactional(isolation = Isolation.SERIALIZABLE)
     public void methodA() {
          userMapper.insert()
          methodB();
     }
}

public class B{
      public void methodB() {
          userMapper.insert()
     }

@Transactional
  public void methodC() {
          userMapper.insert()
     }
}

이 클래스 A에서methodA가 클래스 B를 호출하는 방법methodB/methodC는 모두 실행할 수 있습니다.
public class A{
     @Transactional(isolation = Isolation.SERIALIZABLE)
     public void methodA() {
          userMapper.insert()
          methodB();
     }
}

public class B{
      @Transactional(propagation = Propagation.REQUIRES_NEW)
      public void methodB() {
          userMapper.insert()
     }

}

이 클래스 A에서methodA가 클래스 B 방법을 호출하면methodB 방법이 사라집니다.Propagation 때문입니다.REQUIRES_NEW 이 전파 단계는 자신 REQUIRES_NEW , , , , 。입니다. 여기는methodA가methodB를 호출합니다. methodB를 실행할 때methodA 사물이 끊기고 methodB가 실행될 때까지 기다린 후에methodA가 끊긴 사물이 실행을 회복합니다.그러나 여기는methodA의 격리 단계Isolation.SERIALIZABLE가 직렬로 실행되기 때문에 자물쇠가 사라집니다.

public class A{
     public void methodA() {
          userMapper.insert()
          methodB();
     }
}

public class B{
      @Transactional(propagation = Propagation.REQUIRES_NEW)
      public void methodB() {
          userMapper.insert()
     }

}

여기 methodA () 방법은 사물이 없습니다. methodB () 방법 @Transactional (propagation = Propagation. REQUIRES NEW) 이 전파 특성은 새로운 사물입니다. 여기 methodA ()는 사물이 실행되지 않고 methodB ()는 사물이 있습니다. 굴러갈 수 있습니다.

좋은 웹페이지 즐겨찾기