SpringBoot超詳細(xì)講解事務(wù)管理
1. 事務(wù)的定義
事務(wù)是由 N 步數(shù)據(jù)庫(kù)操作序列組成的邏輯執(zhí)行單元,這系列操作要么全部執(zhí)行,要么全部放棄執(zhí)行。
2. 事務(wù)的特性
事務(wù)的 ACID
特性:
- 原子性:事務(wù)是應(yīng)用中不可分割的最小執(zhí)行體
- 一致性:事務(wù)執(zhí)行的結(jié)果必須使得數(shù)據(jù)從一個(gè)一致性狀態(tài)轉(zhuǎn)變?yōu)榱硪粋€(gè)一致性狀態(tài)
- 隔離性:各個(gè)事務(wù)的執(zhí)行互不干擾,任何事務(wù)的內(nèi)部操作對(duì)其他事務(wù)都是隔離的
- 持久性:事務(wù)一旦提交,對(duì)數(shù)據(jù)所做的任何修改都要記錄到永久存儲(chǔ)器中
3. 事務(wù)的隔離性
常見(jiàn)的并發(fā)異常
- 第一類(lèi)丟失更新、第二類(lèi)丟失更新
- 臟讀、不可重復(fù)讀、幻讀
常見(jiàn)的隔離級(jí)別
- Read Uncommitted:讀取未提交的數(shù)據(jù)
- Read Commited:讀取已提交的數(shù)據(jù)
- Repeatable Read:可重復(fù)讀
- Serializable:串行化
第一類(lèi)更新丟失:某一個(gè)事務(wù)的回滾,導(dǎo)致另一個(gè)事務(wù)已更新的數(shù)據(jù)丟失了。
第二類(lèi)更新丟失:某一個(gè)事務(wù)的提交,導(dǎo)致另一個(gè)事務(wù)已更新的數(shù)據(jù)丟失了。
臟讀:某一個(gè)事務(wù),讀取了另一個(gè)事務(wù)未提交的數(shù)據(jù)。
不可重復(fù)讀:某一個(gè)事務(wù),對(duì)同一個(gè)數(shù)據(jù)前后讀取的結(jié)果不一致。
幻讀:某一個(gè)事務(wù),對(duì)同一個(gè)表前后查詢到的行數(shù)不一致。
隔離級(jí)別 | 第一類(lèi)丟失更新 | 臟讀 | 第二類(lèi)丟失更新 | 不可重復(fù)讀 | 幻讀 |
---|---|---|---|---|---|
Read Uncommitted | 是 | 是 | 是 | 是 | 是 |
Read Commited | 否 | 否 | 是 | 是 | 是 |
Repeatable Read | 否 | 否 | 否 | 否 | 是 |
Repeatable Read | 否 | 否 | 否 | 否 | 否 |
4. 事務(wù)管理
實(shí)現(xiàn)機(jī)制
悲觀鎖(數(shù)據(jù)庫(kù))
- 共享鎖(S鎖):事務(wù)A對(duì)某數(shù)據(jù)加了共享鎖以后,其他事務(wù)只能對(duì)該數(shù)據(jù)加共享鎖,但不能加排他鎖
- 排他鎖(X鎖):事務(wù)A對(duì)某數(shù)據(jù)加了排他鎖以后,其他事務(wù)對(duì)該數(shù)據(jù)既不能加共享鎖,也不能加排他鎖。
樂(lè)觀鎖(自定義)
- 版本號(hào)、時(shí)間戳等
- 在更新數(shù)據(jù)前,檢查版本號(hào)是否發(fā)生變化。若發(fā)生變化則取消本次更新,否則就更新數(shù)據(jù)(版本號(hào)+1)
Spring 事務(wù)管理
聲明式事務(wù)
- 通過(guò) XML 配置,聲明某方法的事務(wù)特征。
- 通過(guò)注解,聲明某方法的事務(wù)特征。
編程式事務(wù)
- 通過(guò) TransactionTemplate管理事務(wù),并通過(guò)它執(zhí)行數(shù)據(jù)庫(kù)的操作。
5. 示例
package com.nowcoder.community.service; import com.nowcoder.community.dao.AlphaDao; import com.nowcoder.community.dao.DiscussPostMapper; import com.nowcoder.community.dao.UserMapper; import com.nowcoder.community.entity.DiscussPost; import com.nowcoder.community.entity.User; import com.nowcoder.community.util.CommunityUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionTemplate; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import java.util.Date; @Service //@Scope("prototype") public class AlphaService { @Autowired private AlphaDao alphaDao; @Autowired private UserMapper userMapper; @Autowired private DiscussPostMapper discussPostMapper; @Autowired private TransactionTemplate transactionTemplate; public AlphaService() { // System.out.println("實(shí)例化AlphaService"); } @PostConstruct public void init() { // System.out.println("初始化AlphaService"); } @PreDestroy public void destroy() { // System.out.println("銷(xiāo)毀AlphaService"); } public String find() { return alphaDao.select(); } // REQUIRED: 支持當(dāng)前事務(wù)(外部事務(wù)),如果不存在則創(chuàng)建新事務(wù). // REQUIRES_NEW: 創(chuàng)建一個(gè)新事務(wù),并且暫停當(dāng)前事務(wù)(外部事務(wù)). // NESTED: 如果當(dāng)前存在事務(wù)(外部事務(wù)),則嵌套在該事務(wù)中執(zhí)行(獨(dú)立的提交和回滾),否則就會(huì)REQUIRED一樣. @Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED) public Object save1() { // 新增用戶 User user = new User(); user.setUsername("alpha"); user.setSalt(CommunityUtil.generateUUID().substring(0, 5)); user.setPassword(CommunityUtil.md5("123" + user.getSalt())); user.setEmail("alpha@qq.com"); user.setHeaderUrl("http://image.nowcoder.com/head/99t.png"); user.setCreateTime(new Date()); userMapper.insertUser(user); // 新增帖子 DiscussPost post = new DiscussPost(); post.setUserId(user.getId()); post.setTitle("Hello"); post.setContent("新人報(bào)道!"); post.setCreateTime(new Date()); discussPostMapper.insertDiscussPost(post); Integer.valueOf("abc"); return "ok"; } public Object save2() { transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED); transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); return transactionTemplate.execute(new TransactionCallback<Object>() { @Override public Object doInTransaction(TransactionStatus status) { // 新增用戶 User user = new User(); user.setUsername("beta"); user.setSalt(CommunityUtil.generateUUID().substring(0, 5)); user.setPassword(CommunityUtil.md5("123" + user.getSalt())); user.setEmail("beta@qq.com"); user.setHeaderUrl("http://image.nowcoder.com/head/999t.png"); user.setCreateTime(new Date()); userMapper.insertUser(user); // 新增帖子 DiscussPost post = new DiscussPost(); post.setUserId(user.getId()); post.setTitle("你好"); post.setContent("我是新人!"); post.setCreateTime(new Date()); discussPostMapper.insertDiscussPost(post); Integer.valueOf("abc"); return "ok"; } }); } }
到此這篇關(guān)于SpringBoot超詳細(xì)講解事務(wù)管理的文章就介紹到這了,更多相關(guān)SpringBoot事務(wù)管理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
從零實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Spring Bean容器的代碼案例
Spring是一個(gè)非常流行的Java?Web開(kāi)發(fā)框架,它提供了強(qiáng)大的依賴(lài)注入、面向切面編程、聲明式事務(wù)管理等功能,為開(kāi)發(fā)者提供了高效、快速地構(gòu)建Web應(yīng)用程序的工具,在這篇文章中,咱們將一步一步地構(gòu)建一個(gè)簡(jiǎn)單的SpringBean容器,需要的朋友可以參考下2023-06-06基于SpringBoot+Redis的Session共享與單點(diǎn)登錄詳解
這篇文章主要介紹了基于SpringBoot+Redis的Session共享與單點(diǎn)登錄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07SpringBoot yaml中的數(shù)組類(lèi)型取值方式
這篇文章主要介紹了SpringBoot yaml中的數(shù)組類(lèi)型取值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09SpringBoot默認(rèn)包掃描機(jī)制及@ComponentScan指定掃描路徑詳解
這篇文章主要介紹了SpringBoot默認(rèn)包掃描機(jī)制及@ComponentScan指定掃描路徑詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11Java中File文件操作類(lèi)的超詳細(xì)使用教程
File類(lèi)在包java.io.File下、代表操作系統(tǒng)的文件對(duì)象(文件、文件夾),File類(lèi)提供了諸如:定位文件,獲取文件本身的信息、刪除文件、創(chuàng)建文件(文件夾)等功能,下面這篇文章主要給大家介紹了關(guān)于Java中File文件操作類(lèi)的超詳細(xì)使用教程,需要的朋友可以參考下2023-01-01SpringCache常用注解及key中參數(shù)值為null問(wèn)題解析
這篇文章主要介紹了SpringCache常用注解及key中參數(shù)值為null的問(wèn)題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09