簡體   English   中英

SQL中的事務

[英]transactions in SQL

我有以下兩項交易:

T1:

Begin Transaction;
S1: Insert Into Salary Values (103, 60000);
S2: Update Salary Set salary = salary + 10000 Where id = 101;
Commit;

T2:

Begin Transaction;
S3: Select Avg(salary) As a1 From Salary;
S4: Select Avg(salary) As a2 From Salary; 

假設各個語句S1,S2,S3和S4始終自動執行。 假設工資中最初有兩個元組:(101,30000)和(102,50000)。 每個事務運行一次並提交。 事務T1始終以隔離級別Serializable(最高級別)執行。

a)如果事務T2以隔離級別Serializable執行,則T2返回哪些可能的值對a1和a2?

b)如果事務T2在隔離級別為Read-Committed的情況下執行,則T2返回哪些可能的值對a1和a2?

c)如果事務T2以隔離級別“未提交”執行,則T2返回哪些可能的值對a1和a2?

這是我的答案:

a) S1 – S2 – S3 – S4值:a1:50000,a2:50000

S3 – S4 – S1 – S2值:a1:40000,a2:40000

但是我對讀取提交和讀取未提交的工作方式感到困惑。 對B和C的任何幫助,將是一個很大的幫助。

  • read-committed =僅顯示已提交的內容(或SAVED IN DB)
  • read-uncommitted =讀取數據庫中當前的內容(與提交無關)。

給定一個長事務,在發出“提交”命令之前,除非執行“未提交讀”,否則無法查看所有插入/更新/刪除。 在幕后,您插入/更新的數據將被鎖定以進行常規查看。 有時甚至整個表都被鎖定-除非您未提交讀操作,否則根本無法查看任何記錄。

對於快速操作(例如,少於1秒),您不會真正感覺到兩者之間的差異,但要測試差異,您應該為T2打開一個不同的連接並在不使用“ commit”命令的情況下運行T1,那么您會感覺到“鎖定”為已提交讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM