欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot超詳細講解事務(wù)管理

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

1. 事務(wù)的定義

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

2. 事務(wù)的特性

事務(wù)的 ACID 特性:

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

3. 事務(wù)的隔離性

常見的并發(fā)異常

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

常見的隔離級別

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

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

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

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

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

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

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

4. 事務(wù)管理

實現(xiàn)機制

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

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

樂觀鎖(自定義)

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

Spring 事務(wù)管理

聲明式事務(wù)

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

編程式事務(wù)

  • 通過 TransactionTemplate管理事務(wù),并通過它執(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: 支持當前事務(wù)(外部事務(wù)),如果不存在則創(chuàng)建新事務(wù).
    // REQUIRES_NEW: 創(chuàng)建一個新事務(wù),并且暫停當前事務(wù)(外部事務(wù)).
    // NESTED: 如果當前存在事務(wù)(外部事務(wù)),則嵌套在該事務(wù)中執(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";
            }
        });
    }
}

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

相關(guān)文章

  • 從零實現(xiàn)一個簡單的Spring Bean容器的代碼案例

    從零實現(xiàn)一個簡單的Spring Bean容器的代碼案例

    Spring是一個非常流行的Java?Web開發(fā)框架,它提供了強大的依賴注入、面向切面編程、聲明式事務(wù)管理等功能,為開發(fā)者提供了高效、快速地構(gòu)建Web應(yīng)用程序的工具,在這篇文章中,咱們將一步一步地構(gòu)建一個簡單的SpringBean容器,需要的朋友可以參考下
    2023-06-06
  • java編寫貪吃蛇小游戲

    java編寫貪吃蛇小游戲

    貪吃蛇是經(jīng)典手機游戲,既簡單又耐玩。通過控制蛇頭方向吃蛋,使得蛇變長,從而獲得積分。今天我們就來用java來實現(xiàn)下貪吃蛇小游戲,有需要的小伙伴可以參考下
    2015-03-03
  • 基于SpringBoot+Redis的Session共享與單點登錄詳解

    基于SpringBoot+Redis的Session共享與單點登錄詳解

    這篇文章主要介紹了基于SpringBoot+Redis的Session共享與單點登錄,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • java LeetCode題解不同路徑

    java LeetCode題解不同路徑

    這篇文章主要為大家介紹了java LeetCode題解不同路徑示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • SpringBoot yaml中的數(shù)組類型取值方式

    SpringBoot yaml中的數(shù)組類型取值方式

    這篇文章主要介紹了SpringBoot yaml中的數(shù)組類型取值方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringBoot默認包掃描機制及@ComponentScan指定掃描路徑詳解

    SpringBoot默認包掃描機制及@ComponentScan指定掃描路徑詳解

    這篇文章主要介紹了SpringBoot默認包掃描機制及@ComponentScan指定掃描路徑詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • JavaWeb.servlet的基本使用方法詳解

    JavaWeb.servlet的基本使用方法詳解

    Servlet指在服務(wù)器端執(zhí)行的一段Java代碼,可以接收用戶的請求和返回給用戶響應(yīng)結(jié)果,下面這篇文章主要給大家介紹了關(guān)于JavaWeb.servlet基本使用的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • Java中File文件操作類的超詳細使用教程

    Java中File文件操作類的超詳細使用教程

    File類在包java.io.File下、代表操作系統(tǒng)的文件對象(文件、文件夾),File類提供了諸如:定位文件,獲取文件本身的信息、刪除文件、創(chuàng)建文件(文件夾)等功能,下面這篇文章主要給大家介紹了關(guān)于Java中File文件操作類的超詳細使用教程,需要的朋友可以參考下
    2023-01-01
  • java實現(xiàn)傾斜水印鋪滿整張圖

    java實現(xiàn)傾斜水印鋪滿整張圖

    這篇文章主要為大家詳細介紹了java實現(xiàn)傾斜水印鋪滿整張圖的具體代碼,教大家如何控制水印之間的空隙,感興趣的小伙伴們可以參考一下
    2016-06-06
  • SpringCache常用注解及key中參數(shù)值為null問題解析

    SpringCache常用注解及key中參數(shù)值為null問題解析

    這篇文章主要介紹了SpringCache常用注解及key中參數(shù)值為null的問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09

最新評論