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