日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

Spring框架-事务管理注意事项

發(fā)布時(shí)間:2023/12/3 javascript 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring框架-事务管理注意事项 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載自?Spring框架-事務(wù)管理注意事項(xiàng)

常見事務(wù)問(wèn)題

  • 事務(wù)不起作用

    • 可能是配置不起效,如掃描問(wèn)題

  • 事務(wù)自動(dòng)提交了(批量操作中)

    • 可能是在沒事務(wù)的情況下,利用了數(shù)據(jù)庫(kù)的隱式提交

  • 事務(wù)配置說(shuō)明

    通常情況下我們的Spring Component掃描分為兩部分,一部分是Spring Servlet(MVC),一部分是其他Context Config的內(nèi)容。主要掃描Annotation定義,包括@Controller、@Autowired、@Resource、@Service、@Component、@Repository等。

    Spring Servlet部分的掃描配置可以通過(guò)web.xml中DispatchServlet的init-param節(jié)點(diǎn)配置確定。

    Context Config部分的掃描配置為非以上配置的其他Spring配置文件確定。

    為了能夠使用事務(wù),需要防止因Spring Servlet的掃描導(dǎo)致@Service事務(wù)配置失效。可以調(diào)整DispatchServlet中的配置文件,排除對(duì)@Service的掃描。

    配置如下:

    <context:component-scan base-package="com.jiuyescm.xxx"><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> </context:component-scan>

    如何通過(guò)日志判斷事務(wù)是否已經(jīng)被Spring所管理?

  • 在logback或者log4j中對(duì)org.springframework.aop、org.springframework.transaction、org.springframework.jdbc、org.mybatis.spring.transaction進(jìn)行DEBUG級(jí)別日志跟蹤(開發(fā)期)

  • 查看日志中是否有事務(wù)管理、開啟、提交、回滾等字符,如:

    DEBUG o.m.spring.transaction.SpringManagedTransaction - JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@28cfe912] will be managed by Spring
  • 沒有被控制的時(shí)候,日志如下:

    DEBUG o.m.spring.transaction.SpringManagedTransaction - JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@28cfe912] will not be managed by Spring
  • 如何通過(guò)程序判斷是否存在事務(wù)?

    boolean flag = TransactionSynchronizationManager.isActualTransactionActive();

    返回true,則在事務(wù)控制下,否則不在控制下

    什么時(shí)候做了隱式提交?

    在沒有容器事務(wù)的情況下,系統(tǒng)會(huì)嘗試隱時(shí)提交。

    開發(fā)建議:

  • 所有Service代碼中設(shè)置Class級(jí)別的@Transactional,并設(shè)置為只讀,開發(fā)時(shí)可以很容易發(fā)現(xiàn)誤數(shù)據(jù)庫(kù)操作的動(dòng)作。如:@Transactional(readOnly=true)。

  • 所有Service代碼中Public的方法設(shè)置@Transactional,并根據(jù)實(shí)際情況設(shè)置Propagation,可以設(shè)置為REQUIRED。

  • 對(duì)于有異常產(chǎn)生可能的情況下,根據(jù)情況選擇合適的rollbackFor,默認(rèn)情況下可以設(shè)置對(duì)Exception.class或BizException.class進(jìn)行控制。

  • 盡可能減少嵌套的使用方法(Service call Service),采用傳統(tǒng)的Controller-》Service-》Repository(DAO)的模型。

  • 如果需要深入了解Transaction的流程,請(qǐng)自行翻閱和跟蹤Spring和Mybatis相關(guān)代碼。

    以下是嵌套事務(wù)的各種情況下的執(zhí)行結(jié)果(前提數(shù)據(jù)庫(kù)的AutoCommit為true)

    ?

    其他情況按照事務(wù)是否開啟和是否拋出(捕獲)對(duì)應(yīng)異常來(lái)判斷結(jié)果。

    總結(jié)

    以上是生活随笔為你收集整理的Spring框架-事务管理注意事项的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。