商丘网站建设广告,wordpress 三大标签,电话销售做网站推销,文化网站建设心得事务 在数据库中有时候需要把多个步骤的指令当作一个整体来运行#xff0c;这个整体要么全部成功#xff0c;要么全部失败#xff0c;这就需要用到事务。 1、 事务的特点 事务有若干条T-SQL指令组成#xff0c;并且所有的指令昨晚一个整体提交给数据库系统#xff0c;执行… Ø 事务 在数据库中有时候需要把多个步骤的指令当作一个整体来运行这个整体要么全部成功要么全部失败这就需要用到事务。 1、 事务的特点 事务有若干条T-SQL指令组成并且所有的指令昨晚一个整体提交给数据库系统执行时这组指令要么全部执行完成要么全部取消。因此事务是一个不可分割的逻辑单元。 事务有4个属性原子性Atomicity、一致性Consistency、隔离性Isolation以及持久性Durability也称作事务的ACID属性。 原子性事务内的所有工作要么全部完成要么全部不完成不存在只有一部分完成的情况。 一致性事务内的然后操作都不能违反数据库的然后约束或规则事务完成时有内部数据结构都必须是正确的。 隔离性事务直接是相互隔离的如果有两个事务对同一个数据库进行操作比如读取表数据。任何一个事务看到的所有内容要么是其他事务完成之前的状态要么是其他事务完成之后的状态。一个事务不可能遇到另一个事务的中间状态。 持久性事务完成之后它对数据库系统的影响是持久的即使是系统错误重新启动系统后该事务的结果依然存在。 2、 事务的模式 a、 显示事务 显示事务就是用户使用T-SQL明确的定义事务的开始begin transaction和提交commit transaction或回滚事务rollback transaction b、 自动提交事务 自动提交事务是一种能够自动执行并能自动回滚事务这种方式是T-SQL的默认事务方式。例如在删除一个表记录的时候如果这条记录有主外键关系的时候删除就会受主外键约束的影响那么这个删除就会取消。 可以设置事务进入隐式方式set implicit_transaction on; c、 隐式事务 隐式事务是指当事务提交或回滚后SQL Server自动开始事务。因此隐式事务不需要使用begin transaction显示开始只需直接失业提交事务或回滚事务的T-SQL语句即可。 使用时需要设置set implicit_transaction on语句将隐式事务模式打开下一个语句会启动一个新的事物再下一个语句又将启动一个新事务。 3、 事务处理 常用T-SQL事务语句 a、 begin transaction语句 开始事务而trancount全局变量用来记录事务的数目值加1可以用error全局变量记录执行过程中的错误信息如果没有错误可以直接提交事务有错误可以回滚。 b、 commit transaction语句 回滚事务表示一个隐式或显示的事务的结束对数据库所做的修改正式生效。并将trancount的值减1 c、 rollback transaction语句 回滚事务执行rollback tran语句后数据会回滚到begin tran的时候的状态 4、 事务的示例 --开始事务
begin transaction tran_bank;
declare tran_error int;set tran_error 0;begin tryupdate bank set totalMoney totalMoney - 10000 where userName jack; set tran_error tran_error error;update bank set totalMoney totalMoney 10000 where userName jason;set tran_error tran_error error;end trybegin catch print 出现异常错误编号 convert(varchar, error_number()) 错误消息 error_message(); set tran_error tran_error 1;end catch
if (tran_error 0)begin--执行出错回滚事务rollback tran;print 转账失败取消交易;end
elsebegin--没有异常提交事务commit tran;print 转账成功;end
go Ø 异常 在程序中有时候完成一些Transact-SQL会出现错误、异常信息。如果我们想自己处理这些异常信息的话需要手动捕捉这些信息。那么我们可以利用try catch完成。 TRY…CATCH 构造包括两部分一个 TRY 块和一个 CATCH 块。如果在 TRY 块中所包含的 Transact-SQL 语句中检测到错误条件控制将被传递到 CATCH 块可在此块中处理该错误。 CATCH 块处理该异常错误后控制将被传递到 END CATCH 语句后面的第一个 Transact-SQL 语句。如果 END CATCH 语句是存储过程或触发器中的最后一条语句控制将返回到调用该存储过程或触发器的代码。将不执行 TRY 块中生成错误的语句后面的 Transact-SQL 语句。 如果 TRY 块中没有错误控制将传递到关联的 END CATCH 语句后紧跟的语句。如果 END CATCH 语句是存储过程或触发器中的最后一条语句控制将传递到调用该存储过程或触发器的语句。 TRY 块以 BEGIN TRY 语句开头以 END TRY 语句结尾。在 BEGIN TRY 和 END TRY 语句之间可以指定一个或多个 Transact-SQL 语句。CATCH 块必须紧跟 TRY 块。CATCH 块以 BEGIN CATCH 语句开头以 END CATCH 语句结尾。在 Transact-SQL 中每个 TRY 块仅与一个 CATCH 块相关联。 # 错误函数 TRY...CATCH 使用错误函数来捕获错误信息。ERROR_NUMBER() 返回错误号。ERROR_MESSAGE() 返回错误消息的完整文本。此文本包括为任何可替换参数如长度、对象名称或时间提供的值。ERROR_SEVERITY() 返回错误严重性。ERROR_STATE() 返回错误状态号。ERROR_LINE() 返回导致错误的例程中的行号。ERROR_PROCEDURE() 返回出现错误的存储过程或触发器的名称。示例 --错误消息存储过程
if (object_id(proc_error_info) is not null)drop procedure proc_error_info
go
create proc proc_error_info
asselect error_number() 错误编号,error_message() 错误消息,error_severity() 严重性,error_state() 状态好,error_line() 错误行号,error_procedure() 错误对象(存储过程或触发器)名称;
go# 示例用异常处理错误信息 --简单try catch示例
begin tryselect 1 / 0;
end try
begin catchexec proc_error_info; --调用错误消息存储过程
end catch
go# 示例异常能处理的错误信息 --
--简单try catch示例无法处理错误
begin tryselect * * from student;
end try
begin catchexec proc_error_info;
end catch
go
--
--简单try catch示例不处理错误(不存在的表对象)
begin tryselect * from st;
end try
begin catchexec proc_error_info;
end catch
go
--
--异常处理能处理存储过程触发器中不存在表对象的错误信息
if (object_id(proc_select) is not null)drop procedure proc_select
go
create proc proc_select
asselect * from st;
go
begin tryexec proc_select;
end try
begin catch exec proc_error_info;
end catch
go异常不能处理编译期的错误如语法错误。以及重编译造成部分名称对象得不到正确解析的时候所出现的错误。 # 示例无法提交的事务 --创建临时用表
if (object_id(temp_tab, u) is not null)drop table temp_tab
go
create table temp_tab(id int primary key identity(100000, 1),name varchar(200)
)
gobegin trybegin tran;--没有createTime字段alter table temp_tab drop column createTime;commit tran;
end try
begin catchexec proc_error_info;--显示异常信息if (xact_state() -1)beginprint 会话具有活动事务但出现了致使事务被归类为无法提交的事务的错误。 会话无法提交事务或回滚到保存点它只能请求完全回滚事务。 会话在回滚事务之前无法执行任何写操作。会话在回滚事务之前只能执行读操作。 事务回滚之后会话便可执行读写操作并可开始新的事务。;endelse if (xact_state() 0)beginprint 会话没有活动事务。;endelse if (xact_state() 1)beginprint 会话具有活动事务。会话可以执行任何操作包括写入数据和提交事务。;end
end catch
go# 示例处理异常日志信息 --
---异常、错误信息表
if (object_id(errorLog, U) is not null)drop table errorLog
go
create table errorLog(errorLogID int primary key identity(100, 1), --ErrorLog 行的主键。errorTime datetime default getDate(), --发生错误的日期和时间。userName sysname default current_user, --执行发生错误的批处理的用户。errorNumber int, --发生的错误的错误号。errorSeverity int, --发生的错误的严重性。errorState int, --发生的错误的状态号。errorProcedure nvarchar(126), --发生错误的存储过程或触发器的名称。errorLine int, --发生错误的行号。errorMessage nvarchar(4000)
)
go
--
--存储过程添加异常日志信息
if (object_id(proc_add_exception_log, p) is not null)drop proc proc_add_exception_log
go
create proc proc_add_exception_log(logId int 0 output)
as
beginset nocount on;set logId 0;begin tryif (error_number() is null)return;if (xact_state() -1)beginprint 会话具有活动事务但出现了致使事务被归类为无法提交的事务的错误。 会话无法提交事务或回滚到保存点它只能请求完全回滚事务。 会话在回滚事务之前无法执行任何写操作。会话在回滚事务之前只能执行读操作。 事务回滚之后会话便可执行读写操作并可开始新的事务。;endelse if (xact_state() 0)beginprint 会话没有活动事务。;endelse if (xact_state() 1)beginprint 会话具有活动事务。会话可以执行任何操作包括写入数据和提交事务。;end--添加日志信息insert into errorLog values(getDate(), current_user, error_number(), error_severity(), error_state(), error_procedure(), error_line(), error_message());--设置自增值select logId identity;end trybegin catchprint 添加异常日志信息出现错误;exec proc_error_info;--显示错误信息return -1;end catch
end
go
--
---处理异常信息示例
declare id int;
begin trybegin tran;--删除带有外键的记录信息delete classes where id 1;commit tran;
end try
begin catchexec proc_error_info;--显示错误信息if (xact_state() 0)beginrollback tran;endexec proc_add_exception_log id output
end catch
select * from errorLog where errorLogID id;
goØ 游标 游标可以对一个select的结果集进行处理或是不需要全部处理就会返回一个对记录集进行处理之后的结果。 1、游标实际上是一种能从多条数据记录的结果集中每次提取一条记录的机制。游标可以完成 # 允许定位到结果集中的特定行 # 从结果集的当前位置检索一行或多行数据 # 支持对结果集中当前位置的进行修改 由于游标是将记录集进行一条条的操作所以这样给服务器增加负担一般在操作复杂的结果集的情况下才使用游标。SQL Server 2005有三种游标T-SQL游标、API游标、客户端游标。 2、游标的基本操作 游标的基本操作有定义游标、打开游标、循环读取游标、关闭游标、删除游标。 A、 定义游标 declare cursor_name --游标名称
cursor [local | global] --全局、局部
[forward only | scroll] --游标滚动方式
[read_only | scroll_locks | optimistic] --读取方式
for select_statements --查询语句
[for update | of column_name ...] --修改字段参数 forward only | scroll前一个参数游标只能向后移动后一个参数游标可以随意移动 read_only只读游标 scroll_locks游标锁定游标在读取时数据库会将该记录锁定以便游标完成对记录的操作 optimistic该参数不会锁定游标此时如果记录被读入游标后对游标进行更新或删除不会超过 B、 打开游标 open cursor_name; 游标打开后可以使用全局变量cursor_rows显示读取记录条数 C、 检索游标 fetch cursor_name; 检索方式如下 fetch first; 读取第一行 fetch next; 读取下一行 fetch prior; 读取上一行 fetch last; 读取最后一行 fetch absolute n; 读取某一行 如果n为正整数则读取第n条记录 如果n为负数则倒数提取第n条记录 如果n为则不读取任何记录 fetch pelative n 如果n为正整数则读取上次读取记录之后第n条记录 如果n为负数则读取上次读取记录之前第n条记录 如果n为则读取上次读取的记录 D、 关闭游标 close cursor_name; E、 删除游标 deallocate cursor_name; 3、游标操作示例 --创建一个游标
declare cursor_stu cursor scroll forselect id, name, age from student;
--打开游标
open cursor_stu;
--存储读取的值
declare id int,name nvarchar(20),age varchar(20);
--读取第一条记录
fetch first from cursor_stu into id, name, age;
--循环读取游标记录
print 读取的数据如下;
--全局变量
while (fetch_status 0)
beginprint 编号 convert(char(5), id) , 名称 name , 类型 age;--继续读取下一条记录fetch next from cursor_stu into id, name, age;
end
--关闭游标
close area_cursor;--删除游标
--deallocate area_cursor; 转载于:https://blog.51cto.com/kaixinbuliao/1177506