摘要:假如你寫了類似這樣的和偽代碼問題來了,和分別用了兩個分開的事務,如果你用了或,并且是的,這就沒法運行。你需要讓兩次調用運行在同一個事務里。
當你采用Spring之類的框架,用了聲明式事務,難道每一段需要事務的代碼都必須寫成一個bean method,再標上@Transactional?
未免太麻煩了,不信你瞧。假如你寫了類似這樣的Controller和Service (偽代碼):
class UserController { @Autowired UserService us; String updateUser(long userId) { User user = us.authorize(userId); Event e = us.update(user); publishToMQ(e); return "user-page"; } } @Transactional class UserService { User authorize(long userId) {...} void update(User user) {...} }
問題來了,authorize和update分別用了兩個分開的事務,如果你用了Hibernate或JPA,并且user是lazy-loading的,這就沒法運行。你需要讓兩次調用運行在同一個事務里。通常的辦法是把UserController.updateUser也標成@Transactional。可是這么一來,下一句publishToMQ(e);雖然不需要事務,卻也被包在事務里了。
我們可以做得更好!用Java 8做一個Transactor,任何代碼塊可隨時包在事務中!
然后controller可以重寫為:
String updateUser(long userId) { Event e = Transactor.get().apply(() -> { User user = us.authorize(userId); return us.update(user); }); publishToMQ(e); return "user-page"; }
Transactor的實現:
@Component @Transactional public class Transactor { public static Transactor get() { return instance; } publicR apply(Supplier f) { return f.get(); // 有返回值的代碼塊 } public void run(Runnable f) { f.run(); // 無返回值的代碼塊 } @Autowired private ApplicationContext applicationContext; @PostConstruct void setup() { instance = applicationContext.getBean(Transactor.class); //不能寫instance=this } private static Transactor instance; }
代碼中透出四個字:靈活,簡潔!
2015/7/5 Update: 可惜的是,有時會拋出org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread (雖然stacktrace中是有代理類的)
目前實測改用Spring的TransactionTemplate是可以的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64318.html
摘要:網上介紹和集合新特性的代碼太千篇一律了,我來提供些不一樣的。或者實現如下它的實現沒有使用,因為是一種強大到能延遲處理和并行處理的,我們簡單的集合操作不需要這么高級的能力。目前只寫了三個方法,如果有需求,還可以擴充更多的方法。 網上介紹Java 8 lambda和集合新特性的代碼太千篇一律了,我來提供些不一樣的。雖然很簡單,但也是工業級代碼,不是網上抄來抄去的教學代碼。權當給大家提供一個...
摘要:通常,這種模式是通過定義一個代表處理對象的抽象類來實現的,在抽象類中會定義一個字段來記錄后續對象。工廠模式使用表達式第章中,我們已經知道可以像引用方法一樣引用構造函數。 一、為改善可讀性和靈活性重構代碼 1.改善代碼的可讀性 Java 8的新特性也可以幫助提升代碼的可讀性: 使用Java 8,你可以減少冗長的代碼,讓代碼更易于理解 通過方法引用和Stream API,你的代碼會變得更...
摘要:本章中的大部分內容適用于構造函數和方法。第項其他方法優先于序列化第項謹慎地實現接口第項考慮使用自定義的序列化形式第項保護性地編寫方法第項對于實例控制,枚舉類型優先于第項考慮用序列化代理代替序列化實例附錄與第版中項目的對應關系參考文獻 effective-java-third-edition 介紹 Effective Java 第三版全文翻譯,純屬個人業余翻譯,不合理的地方,望指正,感激...
摘要:一個合格的中級前端工程師必須要掌握的個技巧對在畢業季還在找工作的同學,可以說很實用的,如果能全部掌握這些技巧,拿到幾個應該是沒有問題的,當然要注意平時的積累,能力要全面。而且該托管服務是完全免費的。 showImg(https://segmentfault.com/img/remote/1460000019376228?w=1790&h=898); 【阿里云 TXD 前端月刊】- 熱門...
閱讀 1768·2021-10-11 10:57
閱讀 2352·2021-10-08 10:14
閱讀 3393·2019-08-29 17:26
閱讀 3340·2019-08-28 17:54
閱讀 3021·2019-08-26 13:38
閱讀 2885·2019-08-26 12:19
閱讀 3608·2019-08-23 18:05
閱讀 1277·2019-08-23 17:04