spring 如何保證數(shù)據(jù)庫事務(wù)在同一個(gè)連接下執(zhí)行的

ThreadLocal天生為解決相同變量的訪問沖突問題, 所以這個(gè)對(duì)于spring的默認(rèn)單例bean的多線程訪問是一個(gè)完美的解決方案。spring也確實(shí)是用了ThreadLocal來處理多線程下相同變量并發(fā)的線程安全問題。

  • 要想實(shí)現(xiàn)jdbc事務(wù), 就必須是在同一個(gè)連接對(duì)象中操作, 多個(gè)連接下事務(wù)就會(huì)不可控, 需要借助分布式事務(wù)完成。那spring 如何保證數(shù)據(jù)庫事務(wù)在同一個(gè)連接下執(zhí)行的呢?
  • DataSourceTransactionManager 是spring的數(shù)據(jù)源事務(wù)管理器, 它會(huì)在你調(diào)用getConnection()的時(shí)候從數(shù)據(jù)庫連接池中獲取一個(gè)connection, 然后將其與ThreadLocal綁定, 事務(wù)完成后解除綁定。這樣就保證了事務(wù)在同一連接下完成。

事務(wù)開始階段

public static void bindResource(Object key, Object value) throws IllegalStateException {
        Object actualKey = TransactionSynchronizationUtils.unwrapResourceIfNecessary(key);
        Assert.notNull(value, "Value must not be null");
        Map<Object, Object> map = resources.get();
        // set ThreadLocal Map if none found
        if (map == null) {
            map = new HashMap<>();
            resources.set(map);
        }
        Object oldValue = map.put(actualKey, value);
  • ThreadLocal存儲(chǔ)的為DataSource生成的actualKey為key值和ConnectionHolder作為value值封裝成的Map。
private static final ThreadLocal<Map<Object, Object>> resources =
            new NamedThreadLocal<>("Transactional resources");
  • 將 DBResource 和 ConnectionHolder分別作為KV存入 map
    Object oldValue = map.put(actualKey, value);

事務(wù)結(jié)束階段

@Nullable
    private static Object doUnbindResource(Object actualKey) {
        Map<Object, Object> map = resources.get();
        if (map == null) {
            return null;
        }
        Object value = map.remove(actualKey);
        // Remove entire ThreadLocal if empty...
        if (map.isEmpty()) {
            resources.remove();
        }
  • 獲取ThreadLocalMap
 resources.get();
  • 刪除map 的Entry并移除
    Object value = map.remove(actualKey);
        // Remove entire ThreadLocal if empty...
        if (map.isEmpty()) {
            resources.remove();
        }

學(xué)習(xí)更多:
ThreadLocal 面試六連問,你能 Hold 住嗎?
ThreadLocal-面試必問深度解析
Spring事務(wù)之如何保證同一個(gè)Connection對(duì)象

公眾號(hào)"會(huì)講歷史的程序員",歡迎關(guān)注

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.數(shù)據(jù)庫事務(wù)基礎(chǔ)知識(shí) 1.1.何為數(shù)據(jù)庫事務(wù) 數(shù)據(jù)庫事務(wù)的4個(gè)特性 原子性:組成一個(gè)事務(wù)的多個(gè)數(shù)據(jù)庫操作是一個(gè)不...
    小螺釘12138閱讀 1,715評(píng)論 1 18
  • 什么是Spring的事務(wù)管理 ??在實(shí)際開發(fā)中,操作數(shù)據(jù)庫時(shí)都會(huì)涉及到事務(wù)管理問題,為此Spring提供了專門用于...
    紙中圓閱讀 1,469評(píng)論 0 0
  • 這部分主要是開源Java EE框架方面的內(nèi)容,包括Hibernate、MyBatis、Spring、Spring ...
    雜貨鋪老板閱讀 1,577評(píng)論 0 2
  • 枝椏在墻壁上翩翩起舞 人類擅長(zhǎng)模仿,地上是奔跑的魂靈 一定要關(guān)閉房間的燈, 你的回聲才夠清脆,明亮。 此刻定有自由...
    糧食和花圈閱讀 263評(píng)論 7 6
  • 不再把工作當(dāng)做簡(jiǎn)單的重復(fù),而是當(dāng)做一種刻意練習(xí),即使是同樣的工作,每次都給自己提出不一樣的要求,刻意的要求自己做的...
    趕驢閱讀 311評(píng)論 0 0

友情鏈接更多精彩內(nèi)容