一丶游标
游标提供了一种从表中检索数据并进行操作的灵活手段,游标主要用在服务器上,处理由客户端发送给服务器端的SQL语句,或是批处理、存储过程、触发器中的数据处理请求。游标的优点在于它可以定位到结果集中的某一行,并可以对该行数据执行特定操作,为用户在处理数据的过程中提供了很大方便。
一个完整的游标由5部分组成,并且这5个部分应符合下面的顺序:
(1)声明游标
(2)打开游标
(3)从一个游标中查找信息
(4)关闭游标
(5)释放游标
游标分类
SQL Server提供了4种类型的游标,静态游标、动态游标、只进游标和键集驱动游标。这些游标检测结果集变化的能力和内存占用的情况都有所不同,数据源没有办法通知游标当前提取行的更改。游标检测这些变化的能力也受事务隔离级别的影响。
静态游标
静态游标的完整结果集在游标打开时建立在tempdb中。静态游标总是按照游标打开时的原样显示结果集。静态游标在滚动期间很少或根本检测不到变化,虽然它在tempdb中存储了整个游标,但消耗的资源很少。尽管动态游标使用tempdb的程度最低,在滚动期间它能够检测到所有变化,但消耗的资源也更多。键集驱动游标介于二者之间,它能检测到大部分的变化,但比动态游标消耗更少的资源。
动态游标
动态游标与静态游标相对。当滚动游标时,动态游标反映结果集中做的所有更改。结果集中的行数据值、顺序和成员在每次提取时都会改变。所有用户做的全部UPDATE、INSERT和DELETE语句均通过游标可
只进游标
只进游标不支持滚动,它只支持游标从头到尾顺序提取。只在从数据库中提取出来后才能进行检索。对所有由当前用户发出或由其他用户提交、并影响结果集中的行的INSERT、UPDATE和DELETE语句,其效果在这些行从游标中提取时是可见的。
键集驱动游标
打开游标时,键集驱动游标中的成员和行顺序是固定的。键集驱动游标由一套被称为键集的惟一标识符(键)控制。键由以惟一方式在结果集中标识行的列构成。键集是游标打开时来自所有适合SELECT语句的行中的一系列键值。键集驱动游标的键集在游标打开时建立在tempdb中。对非键集列中的数据值所做的更改(由游标所有者更改或其他用户提交)在用户滚动游标时是可见的。在游标外对数据库所做的插入在游标内是不可见的,除非关闭并重新打开游标。
声明游标
声明游标可以使用DECLARE CURSOR语句。此语句有两种语法声明格式,分别为ISO标准语法和TRANSACT-SQL
扩展的语法,下面将分别介绍声明游标的两种语法格式
DECLARE CUR1 CURSOR
FOR
SELECT * FROM Student
使用OPEN打开游标
如果使用INSENSITIV或STATIC选项声明了游标,那么OPEN将创建一个临时表以保留结果集。如果结果集中任意行的大小超过SQL SERVER表的最大行大小,OPEN将失败。如果使用KEYSET选项声明了游标,那么OPEN将创建一个临时表以保留键集。临时表存储在TEMPDB中。
读取游标中的数据
当打开一个游标之后,就可以读取游标中的数据。可以使用FETCH命令读取游标中的某一行数据。
关闭游标
当游标使用完毕之后,使用CLOSE语句可以关闭游标,但不释放游标占用的系统资源。
释放游标
当游标关闭之后,并没有在内存中释放所占用的系统资源,所以可以使用DEALLOCATE命令删除游标引用。当释放最后的游标引用时,组成该游标的数据结构由SQL SERVER释放
DECLARE CUR1 CURSOR
FOR
SELECT * FROM Student
OPEN CUR1
FETCH NEXT FROM CUR1
CLOSE CUR1
DEALLOCATE CUR1
二丶事务
什么是事务
事务是由一系列语句构成的逻辑工作单元。事务和存储过程等批处理有一定程度上的相似之处,通常都是为了完成一定业务逻辑而将一条或者多条语句“封装”起来,使它们与其他语句之间出现一个逻辑上的边界,并形成相对独立的一个工作单元。
当使用事务修改多个数据表时,如果在处理的过程中出现了某种错误,例如,系统死机或突然断电等情况,则返回结果是数据全部没有被保存。因为事务处理的结果只有两种:一种是在事务处理的过程中,如果发生了某种错误则整个事务全部回滚,使所有对数据的修改全部撤销,事务对数据库的操作是单步执行的,当遇到错误时可以随时地回滚;另一种是如果没有发生任何错误且每一步的执行都成功,则整个事务全部被提交。可以看出,有效地使用事务不但可以提高数据的安全性,还可以增强数据的处理效率。
事务包含4种重要的属性
统称为ACID(原子性、一致性、隔离性和持久性),一个事务必须通过ACID测试
1.原子性(Atomic):事务是一个整体的工作单元,事务对数据库所做的操作要么全部执行,要么全部取消。如果某条语句执行失败,则所有语句全部回滚。
2. 一致性(ConDemoltent):事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。如果事务成功,则所有数据将变为一个新的状态;如果事务失败,则所有数据将处于开始之前的状态。
3. 隔离性(Isolated):由事务所作的修改必须与其他事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。
4. 持久性(Durability):当事务提交后,对数据库所做的修改就会永久保存下来
定义显式事务
显式事务是用户自定义或用户指定的事务。可以通过BEGIN TRANSACTION、COMMIT TRANSACTION、COMMIT WORK、ROLLBACK TRANSACTION或ROLLBACK WORK事务处理语句定义显式事务。下面将简单介绍以上几种事务处理语句的语法和参数。
BEGIN TRANSACTION语句
用于启动一个事务,它标志着事务的开始。
COMMIT TRANSACTION语句
用于标志一个成功的隐性事务或用户定义事务的结束
COMMIT WORK语句
用于标志事务的结束
ROLLBACK TRANSACTION语句
用于将显式事务或隐性事务回滚到事务的起点或事务内的某个保存点。当执行事务的过程中发生某种错误,可以使用ROLLBACK TRANSACTION语句或ROLLBACK WORK语句,使数据库撤销在事务中所做的更改,并使数据恢复到事务开始之前的状态。
ROLLBACK WORK语句
用于将用户定义的事务回滚到事务的起点
此语句的功能与ROLLBACK TRANSACTION相同,除非ROLLBACK TRANSACTION接受用户定义的事务名称
提交和回滚事务
结束事务包括“成功时提交事务”和“失败时回滚事务”两种情况,在Transact-SQL中可以使用COMMIT和ROLLBACK结束事务。
COMMIT
提交事务,用在事务执行成功的情况下。COMMIT语句保证事务的所有修改都被保存,同时COMMIT语句也释放事务中使用的资源,例如,事务使用的锁。
ROLLBACK
回滚事务,用于事务在执行失败的情况下,将显式事务或隐式事务回滚到事务的起点或事务内的某个保存点。
开始事务
当一个数据库连接启动事务时,在该连接上执行的所有Transact-SQL语句都是事务的一部分,直到事务结束。开始事务使用BEGIN TRANSACTION语句。下面将以示例的形式演示如何在SQL中使用开始事务
BEGIN TRANSACTION
DECLARE @errorNum int
UPDATE [User] SET CurrentMoney-=10000 WHERE ID=10000
SET @errorNum+=@@ERROR
UPDATE [User] SET CurrentMoney+=10000
WHERE ID=10002
SET @errorNum+=@@ERROR
IF @errorNum>0
BEGIN
ROLLBACK TRAN
PRINT('转账失败!')
END
ELSE
BEGIN
COMMIT TRAN
print('转账成功')
END
————————————————
版权声明:本文为优快云博主「IT小哥哥-ZLF」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/weixin_44870681/article/details/100698298