亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

springBoot(14):使用SQL關系型數據庫-事務處理

發布時間:2020-07-11 04:51:40 來源:網絡 閱讀:762 作者:我愛大金子 欄目:數據庫

一、事務的四個特性(ACID)

原子性(Atomicity):

 事務是一個原子操作,由一系列動作組成。事務的原子性確保動作要么全部完成,要么完全不起作用。


一致性(Consistency):

 一旦事務完成(不管成功還是失敗),系統必須確保它所建模的業務處于一致的狀態,而不會是部分完成部分失敗。在現實中的數據不應該被破壞。


隔離性(Isolation):

 可能有許多事務會同時處理相同的數據,因此每個事務都應該與其他事務隔離開來,防止數據損壞。


持久性(Durability):

 一旦事務完成,無論發生什么系統錯誤,它的結果都不應該受到影響,這樣就能從任何系統崩潰中恢復過來。通常情況下,事務的結果被寫到持久化存儲器中。


二、傳播行為

當事務方法被另一個事務方法調用時,必須指定事務應該如何傳播。

例如:方法可能繼續在現有事務中運行,也可能開啟一個新事務,并在自己的事務中運行。


Spring 定義了七種傳播行為。

2.1、PROPAGATION_REQUIRED

表示當前方法必須運行在事務中。如果當前事務存在,方法將會在該事務中運行。否則,會啟動一個新的事務, Spring 默認使用

2.2、PROPAGATION_SUPPORTS

表示當前方法不需要事務上下文,但是如果存在當前事務的話,那么該方法會在這個事務中運行

2.3、PROPAGATION_MANDATORY

表示該方法必須在事務中運行,如果當前事務不存在,則會拋出一個異常

2.4、PROPAGATION_REQUIRED_NEW

表示當前方法必須運行在它自己的事務中。一個新的事務將被啟動。如果存在當前事務,在該方法執行期間,當前事務會被掛起。如果使用 JTATransactionManager 的話,則需要訪問TransactionManager

2.5、PROPAGATION_NOT_SUPPORTED

表示該方法不應該運行在事務中。如果存在當前事務,在該方法運行期間,當前事務將被掛起。如果使用 JTATransactionManager 的話,則需要訪問 TransactionManager

2.6、PROPAGATION_NEVER

表示當前方法不應該運行在事務上下文中。如果當前正有一個事務在運行,則會拋出異常

2.7、PROPAGATION_NESTED

表示如果當前已經存在一個事務,那么該方法將會在嵌套事務中運行。嵌套的事務可以獨立于當前事務進行單獨地提交或回滾。如果當前事務不存在,那么其行為與PROPAGATION_REQUIRED 一樣。注意各廠商對這種傳播行為的支持是有所差異的。可以參考資源管理器的文檔來確認它們是否支持嵌套事務

三、隔離級別

隔離級別定義了一個事務可能受其他并發事務影響的程度。


3.1、ISOLATION_DEFAULT

使用后端數據庫默認的隔離級別,Spring默認使用,mysql默認的隔離級別為:Repeatable Read( ( 可重復讀) )

3.2、ISOLATION_READ_UNCOMMITTED

讀未提交,最低的隔離級別,允許讀取尚未提交的數據變更,可能會導致臟讀、幻讀或不可重復讀

3.3、ISOLATION_READ_COMMITTED  

讀已提交,允許讀取并發事務已經提交的數據,可以阻止臟讀,但是幻讀或不可重復讀仍有可能發生

3.4、ISOLATION_REPEATABLE_READ  

可重復讀,對同一字段的多次讀取結果都是一致的,除非數據是被本身事務自己所修改,可以阻止臟讀和不可重復讀,但幻讀仍有可能發生

3.5、ISOLATION_SERIALIZABLE 

可串行化,最高的隔離級別,完全服從 ACID 的隔離級別,確保阻止臟讀、不可重復讀以及幻讀,也是最慢的事務隔離級別,因為它通常是通過完全鎖定事務相關的數據庫表來實現的


臟讀(Dirty reads):

 臟讀發生在一個事務讀取了另一個事務改寫但尚未提交的數據時。如果改寫再稍后被回滾了,那么第一個事務獲取的數據就是無效的。


不可重復讀(Nonrepeatable read):

 不可重復讀發生在一個事務執行相同的查詢兩次或兩次以上,但是每次都得到不同的數據時。這通常是因為另一個并發事務在兩次查詢期間進行了更新。


幻讀(Phantom read):

 幻讀與不可重復讀類似。它發生在一個事務(T1)讀取了幾行數據,接著另一個并發事務(T2)插入了一些數據時。在隨后的查詢中,第一個事務(T1)就會發現多了一些原本不存在的記錄。


四、操作

屬性說明 @Transactional

 a、isolation:用于指定事務的隔離級別。默認為底層事務的隔離級別。

 b、noRollbackFor:指定遇到指定異常時強制不回滾事務。

 c、noRollbackForClassName:指定遇到指定多個異常時強制不回滾事務。該屬性可以指定多個異常類名。

 d、propagation:指定事務的傳播屬性。

 e、readOnly:指定事務是否只讀。表示這個事務只讀取數據但不更新數據,這樣可以幫助數據庫引擎優化事務。若真的是一個只讀取的數據庫應設置 readOnly=true

 f、rollbackFor:指定遇到指定異常時強制回滾事務。

 g、rollbackForClassName:指定遇到指定多個異常時強制回滾事務。該屬性可以指定多個異常類名。

 h、timeout:指定事務的超時時長。


注 意:

 mysql為例,存儲引擎不能使用MyISAM,應該使用InnoDB



package com.example.demo.service;

import com.example.demo.mapper.UserLogMapper;
import com.example.demo.mapper.UserMapper;
import com.example.demo.pojo.User;
import com.example.demo.pojo.UserLog;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;

/**
 * 描述
 *
 * @Author: 我愛大金子
 * @Description: 描述
 * @Date: Create in 10:18 2017/6/22
 */
@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private UserLogMapper userLogMapper;
    /**
     * 用戶注冊
     *
     * @return
     */
    @Transactional
    public String register(String name, String ip) {
        // 1.添加用戶
        User user = new User();
        user.setName(name);
        user.setCreateTime(new Date());
        userMapper.insert(user);
        // 測試使用
        boolean flag = true;
        if (flag) {
            throw new RuntimeException();
        }
        // 2.添加注冊日志
        UserLog userLog = new UserLog();
        userLog.setUserName(name);
        userLog.setUserIp(ip);
        userLog.setCreateTime(new Date());
        userLogMapper.insert(userLog);
        return "success";
    }
}


測試:

package com.example.demo;

import com.example.demo.service.UserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.Date;

@RunWith(SpringRunner.class)
@SpringBootTest
public class Springboot3ApplicationTests {

   @Autowired
   private UserService userService;

   @Test
   public void register() {
      String result = userService.register("張三", "192.168.1.1");
      System.out.println(result);
   }

}


效果:

springBoot(14):使用SQL關系型數據庫-事務處理


springBoot(14):使用SQL關系型數據庫-事務處理   springBoot(14):使用SQL關系型數據庫-事務處理



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

台北市| 盘锦市| 潮州市| 景东| 抚宁县| 图木舒克市| 子长县| 德庆县| 鄂州市| 宣化县| 大新县| 赣榆县| 开阳县| 崇礼县| 泸州市| 天水市| 台北县| 卢龙县| 宿州市| 利津县| 从江县| 麟游县| 伊金霍洛旗| 菏泽市| 沅陵县| 息烽县| 子长县| 佛山市| 明光市| 怀远县| 灵丘县| 阿图什市| 龙口市| 永新县| 漠河县| 余干县| 泊头市| 吴旗县| 东宁县| 宽城| 长治县|