1

サービスがロールバック (rollbackfor) に構成されている例外をスローした場合、このロールバックは機能しません。

サービス クラス:

@Service("bookService")
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = { BusinessException.class }, readOnly = true)
public class BookServiceImpl implements BookService {

    @Autowired
    private BookRepository bookDAO;

     @Override
     @Transactional(readOnly = false)
     public void transactionTest(Book book) throws BusinessException {
          try {
               bookDAO.test(book);
          } catch (DAOException e) {
               throw new BusinessException("test rollback - service");
          }
     }
}

リポジトリ クラス:

@Repository("bookRepository")
public class BookRepositoryImpl implements BookRepository {

    @Autowired
    private SessionFactory sessionFactory;

@Transactional(readOnly = false)
@Override
public Book saveOrUpdate(Book book) {
    if (book.getId() != null) {
        getSession().merge(book);
    } else {
        getSession().save(book);
    }
    return book;
}

@Transactional(readOnly = false)
@Override
public void test(Book book) throws DAOException {

    saveOrUpdate(book);
    System.out.println(book.getTitle() + " inserted!");
    throw new DAOException("Test rollback");
}

}

ロールバックが機能する状況が 1 つあります。これには、BookServiceImpl を変更して readOnly = true を削除し、「transactionTest」メソッドの「@Transactional(readOnly = false)」を削除する必要があります。しかし、セキュリティ上の理由から、すべてのクラスに readOnly = true を使用し、readOnly = false を使用するメソッドを指定したいと思います

4

1 に答える 1

2

BookServiceImpl現在、トランザクション 全体の構成は@Transactional(propagation = Propagation.REQUIRED, rollbackFor = { BusinessException.class }, readOnly = true)

transactionTestオーバーライドされたアノテーションの場合、クラスでアノテーションを@Transactional(readOnly = false)オーバーライドすると、指定された属性だけでなく、アノテーション全体が更新されます。

これの代わりに、以下のコードを使用する必要がありますBookServiceImpl

@Service("bookService")
@Transactional(readOnly = true)
public class BookServiceImpl implements BookService {

    @Autowired
    private BookRepository bookDAO;

     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = { BusinessException.class },readOnly = false)
     public void transactionTest(Book book) throws BusinessException {
          try {
               bookDAO.test(book);
          } catch (DAOException e) {
               throw new BusinessException("test rollback - service");
          }
     }
}

さらに、DAO(リポジトリ)レベルで同じ種類のトランザクションが必要な場合は、それを指定するか、サービスにトランザクションを処理させます(リポジトリがクライアントと直接インターフェースされないことを前提としています)。

于 2012-10-17T05:16:00.630 に答える