最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot超詳細講解事務管理

 更新時間:2022年08月23日 15:05:48   作者:LeBron Le  
事務的作用就是為了保證用戶的每一個操作都是可靠的,事務中的每一步操作都必須成功執(zhí)行,只要有發(fā)生異常就 回退到事務開始未進行操作的狀態(tài)。事務管理是Spring框架中最為常用的功能之一,我們在使用Spring Boot開發(fā)應用時,大部分情況下也都需要使用事務

1. 事務的定義

事務是由 N 步數(shù)據(jù)庫操作序列組成的邏輯執(zhí)行單元,這系列操作要么全部執(zhí)行,要么全部放棄執(zhí)行。

2. 事務的特性

事務的 ACID 特性:

  • 原子性:事務是應用中不可分割的最小執(zhí)行體
  • 一致性:事務執(zhí)行的結(jié)果必須使得數(shù)據(jù)從一個一致性狀態(tài)轉(zhuǎn)變?yōu)榱硪粋€一致性狀態(tài)
  • 隔離性:各個事務的執(zhí)行互不干擾,任何事務的內(nèi)部操作對其他事務都是隔離的
  • 持久性:事務一旦提交,對數(shù)據(jù)所做的任何修改都要記錄到永久存儲器中

3. 事務的隔離性

常見的并發(fā)異常

  • 第一類丟失更新、第二類丟失更新
  • 臟讀、不可重復讀、幻讀

常見的隔離級別

  • Read Uncommitted:讀取未提交的數(shù)據(jù)
  • Read Commited:讀取已提交的數(shù)據(jù)
  • Repeatable Read:可重復讀
  • Serializable:串行化

第一類更新丟失:某一個事務的回滾,導致另一個事務已更新的數(shù)據(jù)丟失了。

第二類更新丟失:某一個事務的提交,導致另一個事務已更新的數(shù)據(jù)丟失了。

臟讀:某一個事務,讀取了另一個事務未提交的數(shù)據(jù)。

不可重復讀:某一個事務,對同一個數(shù)據(jù)前后讀取的結(jié)果不一致。

幻讀:某一個事務,對同一個表前后查詢到的行數(shù)不一致。

隔離級別第一類丟失更新臟讀第二類丟失更新不可重復讀幻讀
Read Uncommitted
Read Commited
Repeatable Read
Repeatable Read

4. 事務管理

實現(xiàn)機制

悲觀鎖(數(shù)據(jù)庫)

  • 共享鎖(S鎖):事務A對某數(shù)據(jù)加了共享鎖以后,其他事務只能對該數(shù)據(jù)加共享鎖,但不能加排他鎖
  • 排他鎖(X鎖):事務A對某數(shù)據(jù)加了排他鎖以后,其他事務對該數(shù)據(jù)既不能加共享鎖,也不能加排他鎖。

樂觀鎖(自定義)

  • 版本號、時間戳等
  • 在更新數(shù)據(jù)前,檢查版本號是否發(fā)生變化。若發(fā)生變化則取消本次更新,否則就更新數(shù)據(jù)(版本號+1)

Spring 事務管理

聲明式事務

  • 通過 XML 配置,聲明某方法的事務特征。
  • 通過注解,聲明某方法的事務特征。

編程式事務

  • 通過 TransactionTemplate管理事務,并通過它執(zhí)行數(shù)據(jù)庫的操作。

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("實例化AlphaService");
    }
    @PostConstruct
    public void init() {
//        System.out.println("初始化AlphaService");
    }
    @PreDestroy
    public void destroy() {
//        System.out.println("銷毀AlphaService");
    }
    public String find() {
        return alphaDao.select();
    }
    // REQUIRED: 支持當前事務(外部事務),如果不存在則創(chuàng)建新事務.
    // REQUIRES_NEW: 創(chuàng)建一個新事務,并且暫停當前事務(外部事務).
    // NESTED: 如果當前存在事務(外部事務),則嵌套在該事務中執(zhí)行(獨立的提交和回滾),否則就會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("新人報道!");
        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";
            }
        });
    }
}

到此這篇關于SpringBoot超詳細講解事務管理的文章就介紹到這了,更多相關SpringBoot事務管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java排序算法之計數(shù)排序解析

    Java排序算法之計數(shù)排序解析

    這篇文章主要介紹了Java排序算法之計數(shù)排序解析,找到數(shù)組中數(shù)值最大的元素,創(chuàng)建一個長度為最大元素+1的臨時數(shù)組,這樣就可以把原始數(shù)組轉(zhuǎn)換為以原始數(shù)組元素值為下標,相同元素個數(shù)為值的臨時數(shù)組,需要的朋友可以參考下
    2023-10-10
  • Sentinel熱點key限流的實現(xiàn)詳解

    Sentinel熱點key限流的實現(xiàn)詳解

    這篇文章主要介紹了Sentinel熱點key限流的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • Java開發(fā)者必備10大數(shù)據(jù)工具和框架

    Java開發(fā)者必備10大數(shù)據(jù)工具和框架

    這篇文章主要為大家詳細介紹了Java開發(fā)者必備10大數(shù)據(jù)工具和框架,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • SpringBoot項目URL訪問異常的問題處理

    SpringBoot項目URL訪問異常的問題處理

    這篇文章主要介紹了SpringBoot項目URL訪問異常的問題處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • idea2019版與maven3.6.2版本不兼容的解決方法

    idea2019版與maven3.6.2版本不兼容的解決方法

    這篇文章主要介紹了idea2019版與maven3.6.2版本不兼容的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • Java+Selenium實現(xiàn)控制瀏覽器的啟動選項Options

    Java+Selenium實現(xiàn)控制瀏覽器的啟動選項Options

    這篇文章主要為大家詳細介紹了如何使用java代碼利用selenium控制瀏覽器的啟動選項Options的代碼操作,文中的示例代碼講解詳細,感興趣的可以了解一下
    2023-01-01
  • Myeclipse部署Tomcat_動力節(jié)點Java學院整理

    Myeclipse部署Tomcat_動力節(jié)點Java學院整理

    這篇文章給大家介紹了Myeclipse部署Tomcat的相關知識,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧
    2017-07-07
  • 基于Java注解(Annotation)的自定義注解入門介紹

    基于Java注解(Annotation)的自定義注解入門介紹

    要深入學習注解,我們就必須能定義自己的注解,并使用注解,在定義自己的注解之前,我們就必須要了解Java為我們提供的元注解和相關定義注解的語法
    2013-04-04
  • Java中常見的文件拷貝方式小結(jié)

    Java中常見的文件拷貝方式小結(jié)

    這篇文章主要為大家詳細介紹了JAVA?四種拷貝文件的方式,分析一下他們對內(nèi)存使用的方式和各自應用的場景,其實也是對之前學過的知識做一個回顧吧,快跟隨小編一起學習起來吧
    2024-03-03
  • Java應用程序CPU100%問題排查優(yōu)化實戰(zhàn)

    Java應用程序CPU100%問題排查優(yōu)化實戰(zhàn)

    這篇文章主要介紹了如何排查和優(yōu)化Java應用程序CPU使用率達到100%的問題,文中通過代碼示例和圖文結(jié)合的方式講解的非常詳細,具有一定的參考價值,需要的朋友可以參考下
    2025-02-02

最新評論

昌黎县| 西昌市| 靖远县| 来凤县| 瓮安县| 玉田县| 项城市| 华宁县| 荃湾区| 聊城市| 诸暨市| 台州市| 墨竹工卡县| 江华| 新郑市| 明光市| 靖西县| 余江县| 开阳县| 南部县| 宣威市| 尼木县| 禄丰县| 分宜县| 玉环县| 肃宁县| 二手房| 梧州市| 德昌县| 安徽省| 永吉县| 布尔津县| 民和| 高密市| 朔州市| 措美县| 宜丰县| 林芝县| 长垣县| 郑州市| 神木县|