T-SQL 语句(十)—— 事务
来源:互联网 发布:淘宝上九块九包邮 编辑:程序博客网 时间:2024/06/06 04:43
T-SQL 语句(十)—— 事务
一、事务的特性
1、原子性:事务必须是原子性的工作单元,要么全部执行,要么全部不执行。
2、一致性:事务完成时,必须使所有数据保持一致性。
3、隔离性:由并发事务所做的修改必须与其他并发事务所做的修改隔离。由于事务在开始时就会识别数据所处的状态,以便发生错误时可以回滚操作,所以另一个并发事务要么修改它之前的状态,要么修改它之后的状态,不能在该事务运行时修改它的状态。这也被称为可串行性。
4、持久性:在事务完成后,其操作结果对系统的影响应该是永久的,只要事务成功,就不能再次回滚。
二、创建和使用事务
BEGIN TRAN -- 开始事务PRINT '执行语句 1'IF @@ERROR > 0 GOTO TranRollbackPRINT '执行语句 2' IF @@ERROR > 0 GOTO TranRollbackIF @@ERROR > 0 OR @@ROWCOUNT<>1BEGIN TranRollback: ROLLBACK TRAN -- 如果有错误则回滚事务ENDELSE COMMIT TRAN -- 如果没有错误则提交事务
三、执行事务的注意事项:
1、每个操作之后都要检查一下@@ERROR和@@ROWCOUNT的值。
2、当一个事务结束之后,紧跟之后的T-SQL 代码还可以继续执行,但是出错后不能回滚。
3、已结提交的事务会将数据正式写入数据库,此时不能再回滚事务。
4、当事务执行时付过发生断电等意外,则下次重启系统时,该事务会自动回滚。
5、事务里发送错误使事务无法执行下去时事务也会回滚。
6、禁止在事务中使用的语句:CREATE DATABASE、ALTER DATABASE、DROP DATABASE、LOAD DATABASE、RESTORE DATABASE、BACKUP LOG、RESTORE LOG、LOAD TRANSACTION、DUMP TRANSACTION、DISK INIT、RECONFIGURE、UPDATE STATISTICS
四、事务的执行模式
1、显示事务:明确使用“BEGIN TRAN”语句开始,以“COMMIT TRAN”或“ROLLBACK TRAN”语句结束的事务。
2、自动提交事务。自动提交事务是SQL Server Database Engine 的默认事务方式,每一个 T-SQL 语句都可以看成是一个自动提交的事务。会自动提交事务的语句有:ALTER TABLE、TRUNCATE TABLE、CREATE TABLE、SELECT、INSERT、UPDATE、DELETE、DROP、OPEN、FETCH、REVOKE、GRANT。
3、隐式事务:当执行“SET IMPLICT_TRANSACTIONS ON”语句后SQL Server进入隐式事务模式。隐式事务产生了一个连续的事务链,当事务在提交或回滚后系统自动启动新的事务,不需再次定义事务的开始。
五、事务的隔离级别
1、Read Uncommitted:不隔离数据,该事务执行时允许其他事务同时修改或删除数据。
2、Read Committed:不允许读取没有提交的数据,SQL Server默认的隔离级别。
3、Repeatable Read:在事务中锁定所读取的数据不让其他程序修改和删除,如此可以保证每次读取到的数据是一致的。其他事务可以往该表新增数据。
4、Snapshot:快照隔离,可以为读取数据的事务提供所需数据的一个已提交版本,因为写入数据的事务不会阻塞读取事务的事务。
5、Serialzable:将事务用的数据表全部锁定。该等级并发性最低。
Read Uncommitted与Read Committed属于乐观并发控制,其他属于悲观并发控制。
SET TRANSCTION ISLATION LEVEL READ COMMITTED
六、锁
锁的作用是将数据临时锁定只提供给一个进程或程序使用,并防止其他进程或程序修改或读取。锁对象有:
RID:以记录为锁定单位
KEY:以设置为索引的字段为锁定单位
PAGE:以数据中的数据页或索引页作为锁定单位
EXTENT:以一组连续的八页作为锁定的单位
HOBT:以堆或B-tree 作为锁定的单位。保护索引或没有聚集索引的表中的数据页堆的锁。
TABLE:以整个数据表作为锁定单位
FILE:以数据库文件作为锁定单位
APPLICATION:以元数据作为锁定单位
ALLOCATION_UNIT:以分配单元作为锁定单位
DATABASE:以整个数据库作为锁定单位
SQL Server 的锁定模式:
共享锁:用于不更新的数据读取操作
更新锁:用于可更新数据中,防止多个事务在读取、锁定以及随后可能进行的数据更改时发送死锁,这是一种排他锁
排他锁:用于数据修改操作,确保不会同时对同一数据进行不同的更新。
意向锁:
架构锁:通常在执行依赖于表架构的操作时使用
大容量更新锁:通常在向表进行大容量数据复制且指定 tablock 提示时使用。
键范围锁:使用 serializable 事务隔离级别时包含查询读取的行的范围,确保再次运行查询时其他事务无法插入复合该 serializable 事务查询的行。
- T-SQL 语句(十)—— 事务
- SQL点滴25—T-SQL面试语句(转载)
- T-SQL编程(事务)
- T-SQL 语句(一)—— 数据库操作
- T-SQL 语句(二)—— 数据表操作
- T-SQL 语句(四)—— 视图操作
- T-SQL 语句(五) —— 存储过程
- T-SQL 语句(六)—— 触发器操作
- T-SQL 语句(七)—— 索引
- T-SQL 语句(九)—— 游标
- T—SQL语句之子查询
- T-SQL语句(建库,建表,事务,存储过程,触发器等...)
- SQL Server基础——T-SQL语句
- SQL点滴25—T-SQL面试语句,练练手
- T-SQL 存储过程中使用事务并回滚出错的SQL语句(C#事务处理)
- SQLserver学习(四)——T-SQL编程之事务、索引和视图
- T-SQl事务
- T-SQL:事务
- 写一个简单的汇编语言并运行
- 如何提升程序员的价值
- leecode 解题总结:94. Binary Tree Inorder Traversal
- [11]项目实战-PC 端固定布局(11)
- 文章索引加1
- T-SQL 语句(十)—— 事务
- 二值化神经网络系列一:二值化神经网络介绍
- Struts 优缺点
- final, finally, finalize 的区别
- JSP基础
- 【leetcode】Palindrome Number
- 【leetcode】Reverse Integer
- JSP页面的生命周期
- Spring Web MVC框架(九) XML和JSON视图与内容协商