前言
事務闸溃,是描述一組操作的抽象,比如對數(shù)據(jù)庫的一組操作拱撵,要么全部成功辉川,要么全部失敗。事務具有4個特性:Atomicity(原子性)拴测,Consistency(一致性)乓旗,Isolation(隔離性),Durability(持久性)集索。在實際開發(fā)中屿愚,我們對事務應用最多就是在數(shù)據(jù)庫操作這一環(huán),特別是Spring對數(shù)據(jù)庫事務進行了封裝管理务荆。Spring對事務的支持妆距,確實很強大,但是從本質(zhì)上來講:事務是否生效取決數(shù)據(jù)庫底層是否支持(比如MySQL的MyISAM引擎就不支持事務函匕,Spring能奈何S榫荨),同時一個事務的多個操作需要在同一個Connection上盅惜。事務也往往是在業(yè)務邏輯層來控制吸耿。本篇博客將通過手寫一個Demo來分析Spring事務底層到底是如何幫助我們輕松完成事務管理的!
透徹理解Spring事務設計思想之手寫實現(xiàn)
先來看一眼工程結構:
ConnectionHolder
在Spring中酷窥,有時候我們是不是要配置多個數(shù)據(jù)源DataSource咽安?很顯然,Spring需要通過DataSource來得到操作數(shù)據(jù)庫的管道Connection蓬推,這有點類似于JNDI查找妆棒。
這里通過ConnectionHolder類來完成這個過程,需要思考的是在多線程下沸伏,這顯然是存在問題的糕珊。為避免多線程問題,難道我們采用線程安全的Map毅糟,比如ConcurrentHashMap红选,其實我們真正的目的是什么?是保證一個線程下姆另,一個事務的多個操作拿到的是一個Connection喇肋,顯然使用ConcurrentHashMap根本無法保證坟乾!
Spring很聰明,她提供了一種思路蝶防,來解決甚侣,看下面的代碼!
SingleThreadConnectionHolder
本來線程不安全的间学,通過ThreadLocal這么封裝一下殷费,立刻就變成了線程的局部變量,不僅僅安全了低葫,還保證了一個線程下面的操作拿到的Connection是同一個對象详羡!這種思想,確實非常巧妙嘿悬,這也是無鎖編程思想的一種方式殷绍!
TransactionManager
TransactionManager,這個我們經(jīng)常在Spring里面進行配置吧鹊漠,事務大管家!
UserAccountDao茶行、UserOrderDao
這里通過這2個DAO躯概,想模擬一個事務中賬戶購買、下單2個操作畔师。
UserService
到這里娶靡,可以清晰的看到Spring事務管理的一個縮影了吧!
Test
這里看锉,主要是模擬Spring的注入以及多用戶并發(fā)請求姿锭。
運行結果
你可以發(fā)現(xiàn),一個線程中的一個事務的多個操作伯铣,使用的是同一個Connection呻此!
好了,到這里腔寡,你是否能對Spring實現(xiàn)事務的思想有所了解呢焚鲜?
晚安,早點睡覺放前,明天繼續(xù)忿磅,O(∩_∩)O哈哈~