事务的并发程度取决于事务的隔离级别,如果没有引入隔离界别,则事务并发会引起读脏数据,不可重复读,幻想读
Create table t1 ( a int)
Insert into t1 values(1)
Insert into t1 values(2)
1. Manager stdio开两个窗口,分别设置SET TRANSACTION ISOLATION level READ UNCOMMITTED
1)窗口1 begin tran
update t1 set a=3 where a=1—更新未提交
2)窗口2 select * from t1 --读未提交数据,事务无需等待,如果窗口1rollback后,则窗口2的数据为脏数据,此隔离级别和读提交隔离级别中使用with(nolock)相同,因此在统计数据时使用
3)rollback 窗口1
2.两个窗口设置SET TRANSACTION ISOLATION level READ COMMITTED
1)窗口1 begin tran
update t1 set a=3 where a=1—更新未提交
2)窗口2 select * from t1—读未提交数据,事务需要等待数据提交,此时防止了读脏数据
3)Rollback窗口1,窗口2
4)窗口1 begin tran
Select * from t1
5)窗口2 update t1 set a=3 where a=2—此时无需等待,立刻更新
6)窗口1 接着select * from t1 则和开始select出来的数据不一致,所以此隔离级别不能防止不可重复读
7)rollback 窗口1.,2
3.两个窗口设置SET TRANSACTION ISOLATION level REPEATABLE READ
1)窗口1 begin tran
Select * from t1
2)窗口2 update t1 set a=3 where a=2—此时需要等待
3)窗口1 接着select * from t1 则和开始select出来的数据一致,此隔离级别不能防止不可重复读
4)rollback 窗口1,2
5)窗口1 begin tran
Select * from t1
6)窗口2insert into t1 values(6) –此事务无需等待,直接插入
7)窗口1接着select * from t1 则在此事务中出现读两次不一致,而新出现的为幻像,此可重复读隔离级别不能防止幻想读
8)rollback 窗口1
4.两个窗口设置SET TRANSACTION ISOLATION level SERIALIZABLE
1)窗口1 begin tran
Select * from t1
2)窗口2insert into t1 values(6) –此事务需要等待窗口1事务完成
3)窗口1接着select * from t1 两次读一致,不会出现幻像,此可隔离级别不能防止幻想读,同样也能够防止读脏数据和不一致读
5 ALTER DATABASE test2
SET ALLOW_SNAPSHOT_ISOLATION ON;
两窗口设置SET TRANSACTION ISOLATION LEVEL SNAPSHOT
1)窗口1 begin tran
select * from t1
2)窗口2 insert into t1 values(8
3)窗口1select * from t1 –因为数据更改在快照中,所以数据读取一致