<kbd id="5sdj3"></kbd>
<th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>

    面試官:說說 Spring 事務(wù)設(shè)計(jì)原理?面試必問!

    共 1503字,需瀏覽 4分鐘

     ·

    2021-10-08 19:41

    點(diǎn)擊關(guān)注公眾號,Java干貨及時送達(dá)

    作者:張豐哲
    來源:www.jianshu.com/p/1becdc376f5d

    面試官:說說 Spring 事務(wù)設(shè)計(jì)原理?

    你搞懂了么??

    前言

    事務(wù),是描述一組操作的抽象,比如對數(shù)據(jù)庫的一組操作,要么全部成功,要么全部失敗。事務(wù)具有4個特性:Atomicity(原子性),Consistency(一致性),Isolation(隔離性),Durability(持久性)。

    在實(shí)際開發(fā)中,我們對事務(wù)應(yīng)用最多就是在數(shù)據(jù)庫操作這一環(huán),特別是Spring對數(shù)據(jù)庫事務(wù)進(jìn)行了封裝管理。

    Spring對事務(wù)的支持,確實(shí)很強(qiáng)大,但是從本質(zhì)上來講:事務(wù)是否生效取決數(shù)據(jù)庫底層是否支持(比如MySQL的MyISAM引擎就不支持事務(wù),Spring能奈何!),同時一個事務(wù)的多個操作需要在同一個Connection上。事務(wù)也往往是在業(yè)務(wù)邏輯層來控制。

    本篇博客將通過手寫一個Demo來分析Spring事務(wù)底層到底是如何幫助我們輕松完成事務(wù)管理的!

    透徹理解Spring事務(wù)設(shè)計(jì)思想之手寫實(shí)現(xiàn)

    先來看一眼工程結(jié)構(gòu):

    ConnectionHolder

    在Spring中,有時候我們是不是要配置多個數(shù)據(jù)源DataSource?很顯然,Spring需要通過DataSource來得到操作數(shù)據(jù)庫的管道Connection,這有點(diǎn)類似于JNDI查找。

    這里通過ConnectionHolder類來完成這個過程,需要思考的是在多線程下,這顯然是存在問題的。為避免多線程問題,難道我們采用線程安全的Map,比如ConcurrentHashMap,其實(shí)我們真正的目的是什么?是保證一個線程下,一個事務(wù)的多個操作拿到的是一個Connection,顯然使用ConcurrentHashMap根本無法保證!

    Spring很聰明,她提供了一種思路,來解決,看下面的代碼!另外,Spring 系列面試題和答案全部整理好了,微信搜索Java技術(shù)棧,在后臺發(fā)送:面試,可以在線閱讀。

    SingleThreadConnectionHolder

    本來線程不安全的,通過ThreadLocal這么封裝一下,立刻就變成了線程的局部變量,不僅僅安全了,還保證了一個線程下面的操作拿到的Connection是同一個對象!這種思想,確實(shí)非常巧妙,這也是無鎖編程思想的一種方式!

    TransactionManager

    TransactionManager,這個我們經(jīng)常在Spring里面進(jìn)行配置吧,事務(wù)大管家!最新面試題整理好了,點(diǎn)擊Java面試庫小程序在線刷題。


    UserAccountDao、UserOrderDao

    這里通過這2個DAO,想模擬一個事務(wù)中賬戶購買、下單2個操作。點(diǎn)擊關(guān)注公眾號,Java干貨及時送達(dá)

    UserService

    到這里,可以清晰的看到Spring事務(wù)管理的一個縮影了吧!推薦一個 Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://www.javastack.cn/categories/Spring-Boot/

    Test

    這里,主要是模擬Spring的注入以及多用戶并發(fā)請求。

    運(yùn)行結(jié)果

    你可以發(fā)現(xiàn),一個線程中的一個事務(wù)的多個操作,使用的是同一個Connection!

    好了,到這里,你是否能對Spring實(shí)現(xiàn)事務(wù)的思想有所了解呢?





    關(guān)注Java技術(shù)棧看更多干貨



    獲取 Spring Boot 實(shí)戰(zhàn)筆記!
    瀏覽 58
    點(diǎn)贊
    評論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報
    評論
    圖片
    表情
    推薦
    點(diǎn)贊
    評論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報

    <kbd id="5sdj3"></kbd>
    <th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>
    av婷婷免费在线观看 | 北条麻妃av无码一区二区 | 亚洲黄片在线免费观看 | 国产成人 亚洲 日韩 | 日韩无码破解电影 |