📄 05.txt
字号:
【例5-1】利用事务的概念执行“删除后勤部”操作
declare @transaction_name varchar(32) /* 声明一个32位的varchar型变量 */
select @transaction_name = ' my_transaction_delete '
/* 设置该类变量名为my_transaction_delete */
begin transaction my_transaction_delete
go /* 关于命令 go 的用法请参见第6章存储过程和触发器 */
use company /* 使用company 表*/
go
delete from department where dept_id = ’1012’
go
delete from employee where dept_id = ’1012’
go
commit transaction my_transaction_delete
go
【例5-2】删除后勤部,将后勤部的职工划归到经理室。
begin transaction my_transaction_delete
use company /* 使用company 表*/
go
delete from department where dept_id = ’1012’
save transaction after_delete /* 设置事务恢复断点*/
update employee
set dept_id = ’1001’ where dept_id = ’1012’
/*后勤部的职工编号变成经理室编号*/
if @@error!=0 or @@rowcount=0 then
begin
rollback tran after_delete
/* 回滚到保存点 after_delete,如果使用 rollback my_transaction_delete,则会回滚到事务开始前*/
commit tran
print ‘更新员工信息表时产生错误’
return
end
commit transaction my_transaction_delete
go
【例5-3】 修改0000000学生的学号为0001156。本处的事务是为了保证数据(学号)Score表和IDInfo表的一致性
BEGIN TRAN MyTran /* 开始一个事务 */
UPDATE Score /* 更新Score表 */
SET S_No='0001156'
WHERE S_No='0000000'
IF @@ERROR<>0 /* 检测是否成功更新,@@ERROR返回上一个SQL语句状态 */
BEGIN
PRINT '更新成绩表时出现错误'
ROLLBACK TRAN /* 回滚 */
RETURN
END
UPDATE IDInfo /* 更新IDInfo表 */
SET S_No='0001156'
WHERE S_No='0000000'
IF @@ERROR<>0 /* 检测是否成功更新,@@ERROR返回上一个SQL语句状态 */
BEGIN
PRINT 'An Error occur During UPDATE the table [IdInfo]'
ROLLBACK TRAN /* 回滚 */
RETURN
END
COMMIT TRAN MyTran /* 提交事务 */
【例5-6】图书查询系统中保证查询单据号唯一的应用程序使用锁的例子
Use BookTable
GO
DECLARE @ShareOK INT /*声明一个整型变量ShareOK */
/*系统存储过程sp_GetAppLock带两个参数Recourse 和LockMode *,并返回一个值/
EXEC @ShareOK=sp_GetAppLock
@Recourse=’ ConsultTableID’
@LockMode=’ Exclusive’
IF @ShareOK<0 /*如果独占锁申请失败,则 */
…错误处理代码
….
/*如果独占锁申请成功,则 */
ConsultTableID= ConsultTableID+1
…
EXEC sp_ReleaseAppLock @Recourse=’ ConsultTableID’
/*如果成功操作后,释放所申请的锁 */
GO
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -