2012-06-18 24 views
5

Spring, TX yönetimi üzerinde bize ince ayarlı kontrol sağlayan programatik işlemi destekliyor. Spring'in TransactionTemplate kullanan
1.: Bahar Belgeleri göre, bir tarafından programatik TX yönetimini kullanabilirsiniz doğrudan PlatformTransactionManager yararlanarakBahar programatik işlem yönetimi uyarısı?

transactionTemplate.execute(new TransactionCallbackWithoutResult() { 

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

2. (DAO içine PlatformTransactionManager uygulanmasını enjekte):

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); 

için sadeleştirme uğruna, diyelim ki JDBC veritabanı işlemiyle uğraşıyoruz. herhangi bir veritabanı işlemi ikinci snippet'te updateOperation1(),updateOperation2() meydana geldi için

ben, operasyon aslında herhangi bir işlem içinde yapılmazsa değilse ya ortada bir, JDBCTemplate veya JDBCDaoSupport ile uygulanan, merak ediyorum?

Benim analizim, JDBCTemplate veya JDBCDaoSupport kullanmıyorsak, kaçınılmaz olarak veri kaynağı yönetiminden bağlantı oluşturacak/alacaktır. Elde ettiğimiz bağlantı, işlemi yönetmek için temel alınan PlatformTransactionManager tarafından kullanılan bağlantı değildir.

Spring kaynak kodunu kazdık ve ilgili sınıf PlatformTransactionManager karşılığında TransactionSynchronizationManager alınan ConnectionHolder içerdiği bir bağlantı almayı dener bulundu yağsız. Ben de JDBCTemplate ve JDBCDaoSupport, da TransactionSynchronizationManager parçacığı başına bağlantısı dahil olmak üzere birçok kaynağı yöneten TransactionSynchronizationManager.

Çünkü benzer rutin ile bağlantıyı elde etmeye çalışmak bulundu

(temelde bir iş parçacığı yönetilen kaynağın kendine özgü bir örneğini elde etmek amacıyla Threadlocal kullanın)

PlatformTransactionManager ve JDBCTemplate veya JDBCDaoSupport tarafından alınan bağlantıların aynı olduğunu düşünüyorum, bu durum, yayın programlı işleminin updateOperation1(),updateOperation2()'un işlem tarafından nasıl korunacağını açıklayabilir.

Analizim doğru mu? öyleyse, neden Bahar dokümantasyonu bu uyarıya dikkat etmedi?

cevap

2

Evet, doğru.

çiğ Connection s Bahar tarafından yönetilen işlemlerde (12.3.8 DataSourceTransactionManager) katılmak için özel bir şekilde DataSource dan temin ediniz kullanan herhangi kodu:

Uygulama kodu DataSourceUtils aracılığıyla JDBC bağlantısı almak için gereklidir Java EE'nin standart DataSource.getConnection yerine .getConnection (DataSource).

Başka bir seçenek (eğer getConnection() çağıran kodu değiştiremiyorsanız) TransactionAwareDataSourceProxy ile DataSource akıtmaktır.