繁体   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