2014-10-30 27 views
7

Tôi đang sử dụng quản lý giao tác hướng chú thích với Spring JDBC.Hoạt động JDBC của Springback Rollback khi không có trong giao dịch

Tôi muốn có mùa xuân ném một ngoại lệ khi do nhầm lẫn tôi quên chú thích với @Transactional một phương pháp dịch vụ mà chèn/cập nhật/xóa.

Theo dữ liệu mặc định có thể được chèn/cập nhật/xóa ngay cả trong giao dịch.

+1

Bạn có thể sử dụng Propagation.MANDATORY trong lớp DAO –

+0

Nó được chọn để chỉ sử dụng @Transactional trên lớp dịch vụ vì các giao dịch bắt đầu luôn từ đó. – yannisf

+0

Bạn cũng có thể lặp qua tất cả các lớp dịch vụ thông qua sự phản chiếu và kiểm tra xem tất cả chúng có chứa chú thích @Transactional không. –

Trả lời

1

Bạn có thể sử dụng Propagation.MANDATORY trong lớp DAO của mình.

Propagation.MANDATORY sẽ không bắt đầu giao dịch. Nó sẽ kiểm tra xem phương pháp perticular có được đính kèm với một giao dịch hay không, nếu không container sẽ ném một ngoại lệ.

0

Theo tài liệu (tài liệu Spring) nó chỉ là siêu dữ liệu để đưa ra một dấu hiệu cho thấy các phương pháp hoặc giao diện có thể được cấu hình bởi cái gì đó là 'transactionally biết' (ví dụ:

Chỉ với tx: chú thích-driven và không thuộc tính @Transactional tôi tin rằng bạn sẽ có được "mặc định" transactionality áp dụng:.

thiết lập Tuyên truyền là bắt buộc mức độ cô lập là dEFAULT giao dịch được đọc/ghi mặc định thời gian chờ giao dịch để thời gian chờ mặc định của giao dịch cơ bản.. hệ thống, hoặc không nếu thời gian chờ không được hỗ trợ. ny RuntimeException kích hoạt tính năng cuộn lùi và bất kỳ Ngoại lệ đã kiểm tra nào không. Giả sử bạn đang sử dụng tx: chú thích để lái nó qua một người quản lý giao dịch sau đó bỏ lỡ các thuộc tính @Transactional có nghĩa là bạn không thể áp dụng các thuộc tính như readonly, cô lập, công tác tuyên truyền, rollbackFor, noRollbackFor, vv

Tôi tin rằng MVC là hơi khác nhau - phiên ngủ đông được gắn trực tiếp với yêu cầu MVC - tức là khi yêu cầu được nhận bắt đầu giao dịch.

Trở lại với ví dụ của bạn, mã cho getSession() trong HibernateDAOSupport là như sau:

protected final Session getSession() 
    throws DataAccessResourceFailureException, IllegalStateException 
{ 
    return getSession(this.hibernateTemplate.isAllowCreate()); 
} 

Mà lần lượt các cuộc gọi đến:

/** * Có được một phiên Hibernate, hoặc từ giao dịch hiện tại hoặc * giao dịch mới. Sau này chỉ được phép nếu "allowCreate" là đúng. * .......

protected final Session getSession() 
    throws DataAccessResourceFailureException, IllegalStateException { 
return getSession(this.hibernateTemplate.isAllowCreate()); 
} 

mà cuối cùng các cuộc gọi đến:

/** * .... * @param allowCreate liệu một phiên không giao dịch nên được tạo * khi không có phiên giao dịch có thể được tìm thấy cho thread hiện hành * .... */

private static Session doGetSession(
    SessionFactory sessionFactory, Interceptor entityInterceptor, 
SQLExceptionTranslator jdbcExceptionTranslator, boolean allowCreate) 

về cơ bản, một giao dịch: Session được gắn 1: 1 afa ik, và cách duy nhất để chạy mà không có giao dịch là bằng cách sử dụng JBoss nói có lớp 'persist in' persistence cung cấp giao dịch cho bạn (dưới trang bìa). Thậm chí nếu bạn gọi hàm getQuery() sau getSession(), bạn vẫn có một giao dịch xảy ra vì đó là kết nối JDBC/Hibernate.

Các vấn đề liên quan