2012-06-18 28 views
5

Mùa xuân hỗ trợ giao dịch có lập trình, cho phép chúng tôi kiểm soát tốt đối với việc quản lý TX. Theo Tài liệu mùa xuân, Người ta có thể sử dụng quản lý TX chương trình bằng cách:
1. sử dụng TransactionTemplate Spring:Báo cáo giao diện lập trình mùa xuân có lập trình?

transactionTemplate.execute(new TransactionCallbackWithoutResult() { 

protected void doInTransactionWithoutResult(TransactionStatus status) { 
    try { 
     updateOperation1(); 
     updateOperation2(); 
    } catch (SomeBusinessExeption ex) { 
     status.setRollbackOnly(); 
    } 
} }); 

2. thúc đẩy PlatformTransactionManager trực tiếp (bơm một thực hiện PlatformTransactionManager vào DAO):

DefaultTransactionDefinition def = new DefaultTransactionDefinition(); 
def.setName("SomeTxName"); 
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); 

//txManager is a reference to PlatformTransactionManager 
TransactionStatus status = txManager.getTransaction(def); 
try { 
    updateOperation1(); 
    updateOperation2(); 
} 
catch (MyException ex) { 
    txManager.rollback(status); 
    throw ex; 
} 
txManager.commit(status); 

cho vì mục đích đơn giản hóa, giả sử chúng ta đang làm việc với hoạt động của cơ sở dữ liệu JDBC.

tôi tự hỏi đối với bất kỳ hoạt động cơ sở dữ liệu đã xảy ra tại updateOperation1(),updateOperation2() trong đoạn thứ hai, hoặc là nó được thực hiện với JDBCTemplate hoặc JDBCDaoSupport, nếu không, các hoạt động được thực sự không được thực hiện trong bất kỳ giao dịch, phải không?

Phân tích của tôi là nếu chúng tôi không sử dụng JDBCTemplate hoặc JDBCDaoSupport, chúng tôi chắc chắn sẽ tạo/truy xuất kết nối từ quản lý nguồn dữ liệu. kết nối chúng tôi nhận được tất nhiên không phải là kết nối được sử dụng bởi PlatformTransactionManager cơ bản để quản lý giao dịch.

tôi đào mã nguồn mùa xuân và lướt lớp liên quan phát hiện ra rằng PlatformTransactionManager sẽ cố gắng để lấy một kết nối chứa trong ConnectionHolder mà đổi lại lấy từ TransactionSynchronizationManager. Tôi cũng thấy JDBCTemplateJDBCDaoSupport, cũng cố gắng để có được kết nối với thói quen tương tự từ TransactionSynchronizationManager.

TransactionSynchronizationManager quản lý nhiều tài nguyên bao gồm kết nối cho mỗi thread (về cơ bản sử dụng Threadlocal để đảm bảo một thread có được đối tượng duy nhất của riêng mình của tài nguyên được quản lý)

Vì vậy, tôi nghĩ rằng kết nối được truy xuất bởi PlatformTransactionManager và JDBCTemplate hoặc JDBCDaoSupport cũng giống nhau, điều này có thể giải thích cách giao dịch lập trình mùa xuân đảm bảo updateOperation1(),updateOperation2() được bảo vệ bởi giao dịch.

Phân tích của tôi có đúng không? nếu có, tại sao tài liệu hướng dẫn mùa xuân đã không nhấn mạnh cảnh báo này?

Trả lời

2

Vâng, đúng.

Bất kỳ mã có sử dụng nguyên Connection s nên lấy chúng ra khỏi DataSource theo cách đặc biệt để tham gia vào các giao dịch bởi Spring quản lý (12.3.8 DataSourceTransactionManager):

mã chương trình sẽ yêu cầu để lấy các kết nối JDBC qua DataSourceUtils .getConnection (DataSource) thay vì DataSource.getConnection tiêu chuẩn của Java EE.

Tùy chọn khác (nếu bạn không thể thay đổi mã gọi getConnection()) là để bọc DataSource với TransactionAwareDataSourceProxy.

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