版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_36027342/article/details/89307551
事物:一个事务由一个或者多个完成一组的一组相关行为的SQL语句,通过事务机制确保这一组SQL所执行的操作要么完全成功的执行,要么一点也不执行。
事务特性:ACID,即原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability)
在SQL server中:
- 自动提交事务:每条单独的语句都是一个事务,如果成功执行,则自动提交;如果错误,则自动回滚,这是 SQL Server 的默认模式;
- 隐式事务:不需要描述事务的开始,只需要提交或回滚事务;SQL Server 将在提交或回滚当前事务后自动启动新事务。
- 显式事务:每个事务均以 BEGIN TRANSACTION 语句显式开始,以 COMMIT 或 ROLLBACK 语句显式结束;开始事务:BEGIN TRANSACTION;提交事务:COMMIT TRANSACTION;回滚(撤销)事务:ROLLBACK TRANSACTION;查阅 SQL Server 联机丛书,掌握 CREATE PROCEDURE、CREATE TRIGGER 等语句的语法及使用。
1.自动提交事务与隐式事务
--自动提交事务
insert into Reader values('rd2018110',1,'邱二','计算机科学学院','9322666',default)
--隐式事务
set implicit_transactions on
insert into Reader values('rd2018111',1,'邱三','计算机科学学院','9322666',default)
go
select * from Reader
运行结果:
2.与存储过程结合,使用事务来保证数据的一致性
--存储过程,实现借书功能;
alter procedure usp_borrow
@rdID char(9),
@bkID char(9),
@DateBorrow datetime,
@DateLendPlan datetime
as
begin tran
print'begin tran'
begin try
--先判断图书状态
declare @bkState int
select @bkState=bkState from Book where bkID=@bkID
if(@bkState!=1)
raiserror('借书失败!!该图书不在馆!',16,1)
else
begin
--判断读者借书是否已满
declare @rdBorrowQty int,@canLendQty int
select @canLendQty=canLendQty,@rdBorrowQty=rdBorrowQty from Reader,ReaderType
where rdID=@rdID and Reader.rdType=ReaderType.rdType;
if(@rdBorrowQty>=@canLendQty)
raiserror('借书失败!!该读者借书已达上限!',16,1)
else
begin
insert into Borrow(rdID,bkID,DateBorrow,DateLendPlan)
values(@rdID,@bkID, @DateBorrow,@DateLendPlan);
--修改图书状态
update Book set bkState=0 where bkID=@bkID;
--修改借书数量
update Reader set rdBorrowQty=rdBorrowQty+1 where rdID=@rdID;
print @rdID+'借'+@bkID+'成功!!'
commit
print'commit'
end
end
end try
begin catch
DECLARE @ErrorMessage NVARCHAR(4000)
select @ErrorMessage = ERROR_MESSAGE()
raiserror(@ErrorMessage,16,1)
rollback
print'rollback'
end catch
测试执行
--测试执行
declare @date datetime,@date_plan datetime
--获取当前时间为借书时间
set @date=GETDATE()
--计划还书时间为借书后的第十天
set @date_plan=GETDATE()+10
exec usp_borrow'rd2018001','bk2018001',@date,@date_plan
运行结果:
第一次运行,借书成功:
第二次运行
测试代码2:
运行结果:
三.SQL Server 身份验证模式、登录帐户、数据库帐户、权限管理
1.新建两个登录帐户(帐户名:wtq,密码 wtq888; 帐户名:test,密码:test888), 其中,帐户 wtq可对BooksDB数据库中的ReaderType表进行SELECT、 INSERT操作,但无权进行DELETE、 UPDATE 操作。帐户 test 无权访问 BooksDB 数据库。
运行结果:
2.分别使用SSMS与SQL命令实现此功能: 授予帐户wtq 对ReaderType表进行DELETE、 UPDATE 操作的权限
实现代码:
sql语句:
SSMS实现: