91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

Spring事務隔離級別簡介及實例解析

發布時間:2020-08-29 05:07:02 來源:腳本之家 閱讀:192 作者:CupOnDesk 欄目:編程語言

本文研究的主要是Spring事務隔離級別(solation level)介紹及例子,具體如下。

當兩個事務對同一個數據庫的記錄進行操作時,那么,他們之間的影響是怎么樣的呢?這就出現了事務隔離級別的概念。數據庫的隔離性與并發控制有很大關系。數據庫的隔離級別是數據庫的事務特性ACID的一部分。ACID,即原子性(atomicity)、一致性(consistency)、隔離性(isolation)和持久性(durability)。Spring的事務隔離級別有四個:READ_UNCOMMITTEDREAD_COMMITTEDREPEATABLE_READSERIALIZABLE。還有一個,是數據庫默認的隔離級別DEFAULTMySQL默認是REPEATABLE_READ

下面來具體看看。

READ_UNCOMMITTED

顧名思義,READ_UNCOMMITTED意思是,一個事務可以讀取到另一個事務未提交的事務記錄。換句話說,a transaction can read the data that is still uncommitted by other transactions。這是Spring事務最弱的隔離級別。見下面的圖,事務A開啟,寫入一條記錄,這時候,事務B讀入數據,讀到了這條記錄,但是,之后事務A回滾。因此,事務B讀到的數據不是有效的(the database is in an invalid state)。這種情況稱為臟讀(dirty read)。除了臟讀的問題,READ_UNCOMMITTED還可能出現non-repeatable read(不可重復讀)和phantom read(幻讀)的問題。

Spring事務隔離級別簡介及實例解析

READ_COMMITTED

READ_COMMITTED隔離級別表明,一個事務只能讀取到已經提交的記錄,不能讀取到未提交的記錄。換句話說,a transaction can only read the committed data, and it can't read the uncommitted data.因此,dirty read的情況不再發生,但可能會出現其他問題。見下圖。

Spring事務隔離級別簡介及實例解析

在事務A兩次讀取的過程之間,事務B修改了那條記錄并進行提交。因此,事務A前后兩次讀取的記錄不一致。這個問題稱為non-repeatable read(不可重復讀)。(兩次讀取的記錄不一致,重復讀取就會發現問題。)

除了non-repeatable read的問題,READ_COMMITTED還可能發生phantom read的問題。

REPEATABLE_READ

REPEATABLE_READ意思是,一個事務可以多次從數據庫讀取某條記錄,而且多次讀取的那條記錄都是一致的,相同的。這個隔離級別可以避免dirty read和non-repeatable read的問題,但可能發生phantom read的問題。如下圖。

Spring事務隔離級別簡介及實例解析

事務A兩次從數據庫讀取一系列記錄,期間,事務B插入了某條記錄并提交。事務A第二次讀取時,會讀取到事務B剛剛插入的那條記錄。在事務期間,事務A兩次讀取的一系列記錄不一致,這個問題稱為phantom read。

SERIALIZABLE

SERIALIZABLE是Spring最強的隔離級別。事務執行時,會在所有級別上加鎖,比如read和write時都會加鎖,仿佛事務是以串行的方式進行的,而不是一起發生的。這會防止dirty read、non-repeatable read和phantom read的出現,但是,會帶來性能的下降。

DEFAULT

MySQL默認是REPEATABLE_READ

例子

下面,我們看一個例子。在數據庫mysql里開啟一個事務,不提交。然后,另一個事務讀取記錄。

剛開始,數據庫里的記錄,如圖

Spring事務隔離級別簡介及實例解析

接下來,在數據庫mysql中開啟事務A,并插入一條記錄。

Spring事務隔離級別簡介及實例解析

在service的業務類的事務屬性配置為READ_UNCOMMITTED

@Transactional(isolation=Isolation.READ_UNCOMMITTED)
public class AccountService {
	private AccountDAO accountDAO;
	public AccountDAO getAccountDAO() {
		return accountDAO;
	}
	public void setAccountDAO(AccountDAO accountDAO) {
		this.accountDAO = accountDAO;
	}
	public void transfer(String from, String to, double money) {
		accountDAO.outMoney(from, money);
		accountDAO.inMoney(to, money);
	}
	public void readAllUser() {
		List<Account> accounts = accountDAO.getAllUser();
		for (Account account : accounts) {
			System.out.println(account);
		}
	}
}

運行下面的測試類

package com.chris.service;
import static org.junit.Assert.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class ReadAllUserTest {
	@Autowired
	  private AccountService accountService;
	@Test
	  public void test() {
		accountService.readAllUser();
	}
}

結果如下:

Spring事務隔離級別簡介及實例解析

可見,這個事務讀取到了未提交的數據。

這時候,將mysql中開啟的事務A回滾。

mysql> rollback;

再次運行程序,結果為

Account [name=Michael, money=1000.0]
Account [name=Jane, money=1000.0]
Account [name=Kate, money=1000.0]

總結

以上就是本文關于Spring事務隔離級別簡介及實例解析的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

向AI問一下細節

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

AI

福安市| 长沙市| 荃湾区| 腾冲县| 冀州市| 积石山| 榆树市| 阿拉善右旗| 普兰店市| 建瓯市| 蒲江县| 闸北区| 沙河市| 托克托县| 乌兰浩特市| 米泉市| 蕲春县| 大城县| 诏安县| 高唐县| 潢川县| 万源市| 屏东县| 临洮县| 安远县| 岑溪市| 洛川县| 义乌市| 肇庆市| 清新县| 西乌珠穆沁旗| 宾川县| 六盘水市| 察雅县| 环江| 西充县| 三都| 武功县| 长宁县| 洪洞县| 广宁县|