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 JDBCTemplate
và JDBCDaoSupport,
cũng cố gắng để có được kết nối với thói quen tương tự từ TransactionSynchronizationManager.
Vì 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?