SpringBoot聲明式事務

目錄

  • 事務的基本特征
  • 隔離級別
  • 傳播行為
  • @Transcation

事務的基本特征(ACID)

Atomic(原子性)

  事務中包含的操作被看作一個整體的業務單元,這個業務單元中的操作要么全部成功,要么全部失敗,不會出現部分失敗和部分成功的場景

Consistency(一致性)

  事務在完成時,必須使所有的數據都保持一直狀態,在數據庫中所有的修改都基于事務,保證了數據的完整性

Isolation(隔離性)

  多個應用程序線程同時訪問統一數據,這樣數據庫同樣的數據就會在各個不同的事務中被訪問,這樣會產生丟失更新,為了壓制丟失更新的產生,數據庫定義了隔離級別的概念,通過它的選擇,可以在不同程度上壓制丟失更新的產生。因為互聯網的應用常常面對高并發的場景,所以隔離性是需要掌握的重點內容

Durability(持久性)

  事務結束后,所有的數據都會固化到一個地方,如保存磁盤當中,即時斷電重啟后也可以提供應用程序訪問


  為了壓制丟失更新,數據庫提出了隔離級別,在不同程度上壓制更新

  也許會有一個疑問,都全部消除丟失更新不就好了嗎,為什么只是在不同的程度.上壓制丟失更新呢?

  其實這個問題是從兩個角度去看的,一個是數據的一致性,另一個是性能。數據庫現有的技術完全可以避免丟失更新,但是這樣做的代價,就是付出鎖的代價,在互聯網中,系統不單單要考慮數據的-致性,還要考慮系統的性能。試想,在互聯網中使用過多的鎖,--旦出現商品搶購這樣的場景,必然會導致大量的線程被掛起和恢復,因為使用了鎖之后,一個時刻只能有一個線程訪問數據,這樣整個系統就會十分緩慢,當系統被數千甚至數萬用戶同時訪問時,過多的鎖就會引發宕機,大部分用戶線程被掛起,等待持有鎖事務的完成,這樣用戶體驗就會十分糟糕。因為用戶等待的時間會十分漫長,一般而言,互聯網系統響應超過5秒,就會讓用戶覺得很不友好,進而引發用戶忠誠度下降的問題。所以選擇隔離級別的時候,既需要考慮數據的一致性避免臟數據,又要考慮系統性能的問題。因此數據庫的規范就提出了4種隔離級別來在不同的程度上壓制丟失更新。

隔離級別

未提交讀

  最低的隔離級別,含義是允許一個事務讀取另外一個事務沒有提交的數據。未提交讀是一種危險的隔離級別,實際開發中應用不廣

  • 優點:并發能力高。適合那些對數據一致性沒有要求而追求高并發的場景
  • 缺點:出現臟讀

讀寫提交

  指一個事務只能讀取一個事務已經提交的數據,不能讀取未提交的數據

  • 優點:克服臟讀
  • 缺點:出現不可重復讀

可重復讀

  可重復讀的目標是克服讀寫提交中出現的不可重復讀的現象,因為在讀寫提交的時候,可能出現一些值的變化,影響當前事務的執行

  • 優點:克服不可重復讀
  • 缺點:出現幻讀

串行化

  數據庫最高的隔離級別,它會要求所有的SQL都會按照順序執行,這樣就可以克服上訴隔離級別出現的各種問題,所以它能完全保證數據的一致性


  追求更高的隔離級別,它能更好地保證數據的一致性,但是也要付出鎖的代價。有了鎖,就意味著性能的丟失,而且隔離級別越高,性能越是直線下降。

  所以在選擇隔離級別時,要考慮的不單單是數據一致性問題,還要考慮系統的性能問題

  一般而言,選擇隔離級別會以讀寫提交為主,它能防止臟讀,而不能避免不可重復讀和幻讀,為了克服數據不一致性和性能問題,程序開發者還設計了樂觀鎖,甚至不再使用數據庫而使用其他手段

  對于隔離級別,不同的數據庫支持也是不一樣的

  • Oracle只支持讀寫提交和串行化,默認隔離級別為讀寫提交
  • MySQL能支持4種,默認隔離級別為可重復讀

傳播行為

  在Spring中,當一個方法調用另外一個方法,可以讓事務采取不同的策略工作,如新建事務或掛起當前事務

?????

  在一個批量任務執行的過程中,調用多個交易時,如果有一些交易發生異常,只是回滾出現異常的交易,而不是里整個批量任務,這樣就能夠是的那些沒有問題的交易可以吮吸完成,而有問題的交易則不做任何事情


@Transcation

  對于聲明式事務,使用@Transaction進行標注,可標注在類活著方法上,當它標注在類上時,代表這個類所有公共(public)非靜態的方法都將啟用事務功能

  默認配置下 Spring 只會回滾運行時、未檢查異常(繼承自 RuntimeException 的異常)或者 Error。

  • 捕獲RuntimeException
  • 捕獲Error
  • 并不捕獲Checked Exception

有了@Transcation,Spring就會知道從哪啟動事務,約定流程:

當上下文開始調用被@Transcation標注的類或者方法時,Spring就會產生AOP的功能。請注意事務的底層需要啟動AOP功能,這就是Spring事務的底層實現

如有一個保存用戶的方法,加入 @Transactional 注解,使用默認配置,拋出異常之后,事務會自動回滾,數據不會插入到數據庫。

@RestController
public class HouseController {@Autowiredprivate HouseRepository houseRepository;@GetMapping("/test1")public String test1(){houseRepository.save(new House("house1", "100平方米"));houseRepository.save(new House("house2", "100平方米"));houseRepository.save(new House("house3", "100平方米"));houseRepository.save(new House("house444444444", "100平方米"));houseRepository.save(new House("house5", "100平方米"));return "success";}@GetMapping("/test2")@Transactionalpublic String test2(){houseRepository.save(new House("house6", "100平方米"));houseRepository.save(new House("house7", "100平方米"));houseRepository.save(new House("house8", "100平方米"));houseRepository.save(new House("house999999999", "100平方米"));houseRepository.save(new House("house10", "100平方米"));return "success";}
}

test1方法沒有加入事務,test2方法加入了事務注解。

  test1:當輸入http://localhost:8888/test1

  

數據庫中插入了三條數據

因為第四條數據太長,所以插入失敗,導致第五條正常數據插入失敗,這并不是我們想要的,要么全成功,要么全失敗

  test2:輸入http://localhost:8888/test2

數據庫中數據不變依然是三條數據,插入失敗,所以全部回滾


本文借鑒:《深入淺出Spring Boot 2.x》書中有更詳細的例子

返回頂部

轉載于:https://www.cnblogs.com/echola/p/10999052.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393332.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393332.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393332.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

leetcode1437. 是否所有 1 都至少相隔 k 個元素

給你一個由若干 0 和 1 組成的數組 nums 以及整數 k。如果所有 1 都至少相隔 k 個元素,則返回 True ;否則,返回 False 。 示例 1: 輸入:nums [1,0,0,0,1,0,0,1], k 2 輸出:true 解釋:每個 1 …

數據結構教程網盤鏈接_數據結構101:鏈接列表

數據結構教程網盤鏈接by Kevin Turney凱文特尼(Kevin Turney) Like stacks and queues, Linked Lists are a form of a sequential collection. It does not have to be in order. A Linked list is made up of independent nodes that may contain any type of data. Each no…

多線程之間的通信(等待喚醒機制、Lock 及其它線程的方法)

一、多線程之間的通信。 就是多個線程在操作同一份數據, 但是操作的方法不同。     如: 對于同一個存儲塊,其中有兩個存儲位:name sex, 現有兩個線程,一個向其中存放數據,一個打印其中的數…

Linux iptables 配置詳解

一、配置一個filter表的防火墻 1. 查看本機關于 iptables 的設置情況 # iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) …

06 Nginx

1.檢查linux上是否通過yum安裝了nginx rpm -qi nginx2.解決安裝nginx所依賴包 yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel ope…

java編寫安卓程序代碼,安卓:從Android的Java源代碼code創建UML

i am looking for a program that can create automatically an Uml from my Java-Android source code.I have tested ArgoUml, but it does not support Android.Have any one a suggestion?Thanks!解決方案I can second what Tom Morris wrote in the comment above. Even …

leetcode1052. 愛生氣的書店老板(滑動窗口)

今天,書店老板有一家店打算試營業 customers.length 分鐘。每分鐘都有一些顧客(customers[i])會進入書店,所有這些顧客都會在那一分鐘結束后離開。 在某些時候,書店老板會生氣。 如果書店老板在第 i 分鐘生氣&#xf…

amazon alexa_在Amazon Alexa上推出freeCodeCamp編碼瑣事測驗

amazon alexaNow you can learn coding concepts hands-free using an Amazon Echo.現在,您可以使用Amazon Echo免提學習編碼概念。 freeCodeCamp.org contributor David Jolliffe created a quiz game with questions on JavaScript, CSS, networking, and comput…

第一類第二類丟失更新

第一類丟失更新 A事務撤銷時,把已經提交的B事務的更新數據覆蓋了。這種錯誤可能造成很嚴重的問題,通過下面的賬戶取款轉賬就可以看出來: 時間 取款事務A 轉賬事務B T1 開始事務 T2 開始事務 T3 查詢賬戶余額為1000元 …

oracle數據字典表與視圖

oracle數據字典表與視圖 數據字典是數據的數據,也就是元數據。描述了數據庫的物理與邏輯存儲與相應的信息。模式中對象的定義信息,安全信息,完整性約束信息,和部分的性能監控信息等。數據字典表 與視圖存儲在system表空間中的。有…

團隊作業——項目Alpha版本發布

---恢復內容開始--- https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/homework/3329 <作業要求的鏈接> Gorious Computer <寫上團隊名稱> 發布項目α版本&#xff0c;對項目…

java臟字過濾_臟字過濾

1.[文件]SensitiveWordFilter.java ~ 7KB下載(141)package com.forgov.sharpc.infrastruture.util;import static java.util.Collections.sort;import java.util.ArrayList;import java.util.Collection;import java.util.Comparator;import java.util.HashSet;import java.uti…

react中使用構建緩存_完整的React課程:如何使用React構建聊天室應用

react中使用構建緩存In this video course, youll learn React by building a chat room app.在本視頻課程中&#xff0c;您將通過構建聊天室應用程序來學習React。 By the end of the video, youll have a solid understanding of React.js and have your very own chat room…

leetcode1509. 三次操作后最大值與最小值的最小差

給你一個數組 nums &#xff0c;每次操作你可以選擇 nums 中的任意一個元素并將它改成任意值。 請你返回三次操作后&#xff0c; nums 中最大值與最小值的差的最小值。 示例 1&#xff1a; 輸入&#xff1a;nums [5,3,2,4] 輸出&#xff1a;0 解釋&#xff1a;將數組 [5,3,…

MySQL異步復制

準備&#xff1a;主備庫版本一致&#xff0c;正常安裝軟件。 1、主庫上設置一個復制使用的賬戶&#xff1a; mysql> grant replication slave on *.* to rep1192.168.100.136 identified by dbking; Query OK, 0 rows affected (0.18 sec) mysql> select user,host,passw…

開源一個爬取redmine數據的測試報告系統

背景 軟件測試的最后有一道比較繁瑣的工作&#xff0c;就是編寫測試報告。手寫測試報告在數據統計和分析上面要耗費比較大的事件和精力。之前工作室使用mantis管理bug缺陷。公司有內部有個系統&#xff0c;可以直接從mantis上面獲取數據并進行統計&#xff0c;生成一份測試報告…

java cxf 雙向通訊_CXF 在spring boot 2 發布多個服務

0. 問題來源之前配置cxf服務端都是在spring 3以下&#xff0c;后來使用spring mvc 還都是基于xml的配置文件模式&#xff0c;在springboot模式下&#xff0c;實現起來更為簡單了。此次記錄下spring boot 2下的實現方式。1. 準備工作項目中&#xff0c;直接拉入spring boot cxf相…

小程序 堅屏_如何構建堅如磐石的應用程序

小程序 堅屏不同的應用程序設計選項概述 (An overview of different app design options) When we design software, we constantly think about error cases. Errors have a huge impact on the way we design and architecture a solution. So much so, in fact, that there …

C# 分層

三層架構分為&#xff1a;表現層&#xff08;UI&#xff09;、業務邏輯層&#xff08;BLL&#xff09;、數據訪問層&#xff08;DAL&#xff09;再加上實體類庫&#xff08;Model&#xff09; 轉載請注明出自朱朱家園http://blog.csdn.net/zhgl7688 1、實體類庫&#xff08;Mod…

leetcode1177. 構建回文串檢測(前綴和)

給你一個字符串 s&#xff0c;請你對 s 的子串進行檢測。 每次檢測&#xff0c;待檢子串都可以表示為 queries[i] [left, right, k]。我們可以 重新排列 子串 s[left], …, s[right]&#xff0c;并從中選擇 最多 k 項替換成任何小寫英文字母。 如果在上述檢測過程中&#xf…