Sql Server数据库实验之事务与锁

本文探讨了数据库事务中的graduate和borrow操作,并展示了在不同事务隔离级别下的行为。通过实例展示了read committed、repeatable read级别如何影响数据读取,同时讨论了可能的脏读、不可重复读和幻读问题。实验中,两个并发事务trans1和trans2展示了数据在被修改后的可见性差异。
摘要由CSDN通过智能技术生成

在这里插入图片描述

begin transaction graduate
use library1
go
delete from Reader where Rno='R05'
delete from Borrow where Rno='R05'
go
commit transaction graduate
go


begin transaction borrow1
use library1
go
declare @Bno nchar(10),@num float,@Borrnum int,@Rno nchar(10),@BorrowDate date
select @BorrowDate=getdate()
select @Rno=Rno from Reader where Rname='李伟'
select @Borrnum=Borrnum from Borrow order by Borrnum +1
select @Bno=Bno from Book where Btitle='数据结构'
select @num=COUNT(Bno)from Borrow where Bno=@Bno and ReturnDate is null
if @num<5
begin
insert into Borrow(Borrnum,Rno,Bno,BorrowDate)values(@Borrnum,@Rno,@Bno,@BorrowDate)
commit 
print'李伟可以借阅数据结构'
end
else
begin
rollback transaction
print'此书已经被借阅完'
end
go

commit就是将数据库中的数据提交到回滚段中,会覆盖原先数据

rollback就是将回滚段中的数据回滚到数据库中,不会覆盖数据,不管先前有没有设置回滚点,rollback回滚的数据都不会变,除非commit覆盖了原先的数据
由第二题可以清楚地看出来

Read uncommitted
读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。可能会脏读。
Read committed
读提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。
可能会不可重复读
Repeatable read
重复读,就是在开始读取数据(事务开启)时,不再允许修改操作
可能会幻读
Serializable 序列化
Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
设计的实验:在两个查询窗口中分别创建名称为
Trans1和trans2的事务,在trans1中先后设置不同的事务隔离级别,执行两次查询语句,在trans2的事务中执行更新语句,比较执行结果。

begin transaction trans1
use library1
go
set transaction isolation level repeatable read
select *from Reader where Rname='王小明'
waitfor delay'00:00:10';
select *from Reader where Rname='王小明'
go
commit transaction trans1
go



begin transaction trans2
use library1
go
update Reader set Rage=24 where Rname='王小明'
go
commit transaction trans2
go
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值