linux事务隔离级别,事务的隔离级别(Transaction isolation levels)2
READ COMMITTED
READ COMMITTED這是數(shù)據(jù)庫默認(rèn)的隔離級別。它能保證你不能讀取那張表格數(shù)據(jù),只要有其它事務(wù)還在改變這張表格數(shù)據(jù)??墒?#xff0c;因?yàn)閟ql server在select操作的時(shí),鎖表格時(shí)間就那么一小會(huì)兒,如果一個(gè)事務(wù)在READ COMMITTED級別下重復(fù)讀數(shù)據(jù),這樣那個(gè)數(shù)據(jù)可能還是會(huì)變,或者新的行可能出現(xiàn)并且還是滿足了原來的查詢條件,能查詢到。你以為還是原來的那些數(shù)據(jù),其實(shí)又有新的內(nèi)容在里面了。
READ COMMITTED有兩個(gè)地方要注意。第一,它能阻止?dirty reads,但是第二,它還是允許non-repeatable reads和phantom reads.
第一點(diǎn)阻止?dirty reads,舉個(gè)例子,
-- Step 1:
-- Start a transaction but don't commit it
USE IsolationDB ;
GO
BEGIN TRAN
UPDATE IsolationTest
SET col2 = 'New Value' ;
-- 更新了數(shù)據(jù),但未結(jié)束事務(wù),事務(wù)還在影響這張表格。
-- Step 2:
-- Start a new connection and change your isolation level
USE IsolationDB ;
GO
SET TRANSACTION ISOLATION LEVEL READ COMMITTED ;
SELECT *
FROM IsolationTest ;
--
-- You should notice that the process blocks, and returns
-- no data or messages!
在READ COMMITTED級別下讀取。你注意到過程是堵塞的,不能返回?cái)?shù)據(jù),因?yàn)橛幸粋€(gè)修改事務(wù)影響著。
-- To finish up, perform the following two steps:
-- Step 3:
-- Return to the connection from Step 1 and issue a ROLLBACK
ROLLBACK TRANSACTION ;
-- 回滾事物嘍。
-- Step 4:
-- Rerun the SELECT statement in the connection from Step 2
SELECT *
FROM IsolationTest ;
--
-- Verify that the data is available 可以顯示數(shù)據(jù)了。只不過是原來的數(shù)據(jù)。
這個(gè)就不像READ UNCOMMITTED還能讀取。
看一下READ COMMITTED第二點(diǎn),non-repeatable reads,舉個(gè)例子。
先關(guān)閉全部的查詢窗口。打開兩個(gè)新的查詢窗口。
-- Step 1:
-- Read data in the default isolation level
USE IsolationDB
SET TRANSACTION ISOLATION LEVEL READ COMMITTED ;
BEGIN TRAN
SELECT AVG(col1)
FROM IsolationTest ;
-- 第一步,設(shè)置了默認(rèn)的隔離級別,開始一個(gè)事務(wù)來讀取平均值,
-- Step 2:
-- In a new connection, update the table:
USE IsolationDB ;
UPDATE IsolationTest
SET col1 =500
WHERE col1 =50 ;
-- 第二步,更新了表格。假設(shè)第一步已經(jīng)結(jié)束了,那么第二步的將會(huì)更新成功,即使第一步的連接還是在事務(wù)里。這個(gè)UPDATE是一個(gè)自動(dòng)提交的事務(wù),所以SQL server會(huì)鎖住它,一旦提交完成又自動(dòng)釋放它。
-- Step 3:
-- Go back to the first connection and
-- run the same SELECT statement:
SELECT AVG(col1)
FROM IsolationTest ;
-- 第三步,再次執(zhí)行查詢語句,平均值就變了,這就是一個(gè)non-repeatable read。默認(rèn)的READ COMMITTED隔離級別能阻止正在讀取的數(shù)據(jù)被改變,但是僅僅指的是正在被讀取的數(shù)據(jù)被改變。一旦這個(gè)讀取操作結(jié)束了,那么其它的事務(wù)就能改變數(shù)據(jù),即使讀取操作所在的那個(gè)事務(wù)還打開著,沒有提交結(jié)束。結(jié)果就是,也不能保證我們能取得一樣的數(shù)據(jù)。
總結(jié)
以上是生活随笔為你收集整理的linux事务隔离级别,事务的隔离级别(Transaction isolation levels)2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到洪水滔天巨浪翻滚好吗
- 下一篇: 梦到身上长蘑菇是什么意思啊