日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

事務隔離級別 在spring實戰

作者:望月聽風 更新時間: 2022-03-14 編程語言

四種隔離級別

  • 讀未提交
  • 讀已提交
  • 可重復讀
  • 序列化

如果沒有隔離,多線程出現的問題

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

解釋
臟讀:一個連接讀到另一個連接修改但沒有提交的數據
第一類丟失更新:a連接開啟事務,b連接隨后開啟事務并更新完,但a發生異常回滾,回到a最初的狀態,把b的更新給淹沒
不可重復讀:a讀數據假設為1,b修改數據改為2并提交,a再讀數據發現數據變為2
第二類丟失更新:a連接開啟事務,b連接隨后開啟事務并更新完,a提交事務,把b的更新給淹沒
幻讀:a查詢表中共多少條數據,之后b插入一條數據,a再讀就會發現前后兩次不一致。

選擇隔離級別避免發生問題

在這里插入圖片描述

在spring中添加事務

聲明式事務
  • 注解
  • xml配置文件
編程式事務

TransactionTemplate 這種適合更細粒度的事務

代碼實戰

isolation 隔離級別
propagation 事務傳播
常用的三種:

  • required
  • required-new
  • nested

解釋

required:a調用b,如果a有事務,就按a的事務來,沒有就創建事務,b失敗回滾
required-new:a調用b,創建一個新事務,并暫停外部事務,就是說不管a是夠成功,b都完成了
nested:如果存在外部事務a,則嵌套到外部事務中,a并有獨立的提交和回滾,b如果失敗則回滾,但a不一定,也就是說a不管b成功與否,自己先完成再說,否則就和required-new一樣

如果事務中發生情況就不會插入成功

聲明式事務

@Transactional(isolation = Isolation.REPEATABLE_READ,propagation = Propagation.REQUIRED)
    public void insert(){
        User user = new User();
        userService.insertUser(user);
        int a=1/0;
    }

編程式事務

public void insert(){
        TransactionTemplate template = new TransactionTemplate();
        template.setIsolationLevel(TransactionDefinition.ISOLATION_REPEATABLE_READ);
        template.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        
        template.execute(new TransactionCallback<Object>() {
            @Override
            public Object doInTransaction(TransactionStatus status) {
                User user = new User();
                userService.insertUser(user);
                int a=1/0;
                return null;
            }
        });
    }

原文鏈接:https://blog.csdn.net/miss_na/article/details/123084821

欄目分類
最近更新