1、了解事务和锁

事务:保持逻辑数据一致性与可恢复性,必不可少的利器。

:多用户访问同一数据库资源时,对访问的先后次序权限管理的一种机制,没有他事务或许将会一塌糊涂,不能保证数据的安全正确读写。

死锁:是数据库性能的重量级杀手之一,而死锁却是不同事务之间抢占数据资源造成的。

一个事务中可以包含多个DML语句,一个DDL语句或者一个DCL语句。

事务中的语句要么全部执行,要么全部不执行。

书面解释:事务具有原子性,一致性,隔离性,持久性(ACID)

  • A 原子性:事务必须是一个自动工作的单元,要么全部执行,要么全部不执行。
  • C 一致性:事务把数据库从一个一致状态带入到另一个一致状态,事务结束的时候,所有的内部数据都是正确的。
  • I 隔离性:并发多个事务时,一个事务的执行不受其他事务的影响。
  • D 持久性:事务提交之后,数据是永久性的,不可再回滚,不受关机等事件的影响。

事务在如下情况终止:

  1. 遇到rollback commit命令
  2. 遇到DDL或者DCL语句.
  3. 系统发生错误,崩溃或者退出。

然而在SQL Server中事务被分为3类常见的事务:

  • 自动提交事务:是SQL Server默认的一种事务模式,每条Sql语句都被看成一个事务进行处理,你应该没有见过,一条Update 修改2个字段的语句,只修该了1个字段而另外一个字段没有修改。。
  • 显式事务:T-sql标明,由Begin Transaction开启事务开始,由Commit Transaction 提交事务、Rollback Transaction 回滚事务结束。
  • 隐式事务:使用Set IMPLICIT_TRANSACTIONS ON 将将隐式事务模式打开,不用Begin Transaction开启事务,当一个事务结束,这个模式会自动启用下一个事务,只用Commit Transaction 提交事务、Rollback Transaction 回滚事务即可

2、显式事务的应用

常用语句就四个。

  • Begin Transaction:标记事务开始。
  • Commit Transaction:事务已经成功执行,数据已经处理妥当。
  • Rollback Transaction:数据处理过程中出错,回滚到没有处理之前的数据状态,或回滚到事务内部的保存点。
  • Save Transaction:事务内部设置的保存点,就是事务可以不全部回滚,只回滚到这里,保证事务内部不出错的前提下。
---开启事务
begin tran
--错误捕捉机制,看好啦,这里也有的。并且可以嵌套。
begin try  --语句正确insert into lives (Eat,Play,Numb) values ('猪肉','足球',1)--Numb为int类型,出错insert into lives (Eat,Play,Numb) values ('猪肉','足球','abc')--语句正确insert into lives (Eat,Play,Numb) values ('狗肉','篮球',2)
end try
begin catchselect Error_number() as ErrorNumber,  --错误代码Error_severity() as ErrorSeverity,  --错误严重级别,级别小于10 try catch 捕获不到Error_state() as ErrorState ,  --错误状态码Error_Procedure() as ErrorProcedure , --出现错误的存储过程或触发器的名称。Error_line() as ErrorLine,  --发生错误的行号Error_message() as ErrorMessage  --错误的具体信息if(@@trancount>0) --全局变量@@trancount,事务开启此值+1,他用来判断是有开启事务rollback tran  ---由于出错,这里回滚到开始,第一条语句也没有插入成功。
end catch
if(@@trancount>0)
commit tran  --如果成功Lives表中,将会有3条数据。--表本身为空表,ID ,Numb为int 类型,其它为nvarchar类型
select * from lives

3、事务设置保存点

利用save transaction   和rollback transaction 语句:

---开启事务
begin tran
--错误捕捉机制,看好啦,这里也有的。并且可以嵌套。
begin try    --语句正确insert into lives (Eat,Play,Numb) values ('猪肉','足球',1)   --加入保存点save tran pigOneIninsert into lives (Eat,Play,Numb) values ('猪肉','足球',2)insert into lives (Eat,Play,Numb) values ('狗肉','篮球',3)
end try
begin catchselect Error_number() as ErrorNumber,  --错误代码Error_severity() as ErrorSeverity,  --错误严重级别,级别小于10 try catch 捕获不到Error_state() as ErrorState ,  --错误状态码Error_Procedure() as ErrorProcedure , --出现错误的存储过程或触发器的名称。Error_line() as ErrorLine,  --发生错误的行号Error_message() as ErrorMessage  --错误的具体信息if(@@trancount>0) --全局变量@@trancount,事务开启此值+1,他用来判断是有开启事务rollback tran
end catch
if(@@trancount>0)
rollback tran pigOneIn --表本身为空表,ID ,Numb为int 类型,其它为nvarchar类型
select * from lives

注:事务保存点以上的都将影响,当提交事务以后,只有保存点之前的语句被执行。

事务保存点示例:

在SQL Server中使用rollback会回滚所有的未提交事务状态,但是有些时候我们只需要回滚部分语句,把不需要回滚的语句提到事务外面来,虽然是个方法,但是却破坏了事务的ACID。

SQL中使用事务保存点,即可解决这个问题。

SQL 事务中存在错误信息 进行Catch 回滚事务时

begin trybegin tran Ainsert into dbo.lives ( Eat, Play, Numb, times ) values ( 'A', '', 0, getdate() )select 1/0    --错误信息save tran B_Pointinsert into dbo.lives ( Eat, Play, Numb, times ) values ( 'B', '', 0, getdate() )save tran C_Pointinsert into dbo.lives ( Eat, Play, Numb, times ) values ( 'C', '', 0, getdate() )rollback tran B_Point    --回滚事务点B_Point 即事务点下的部分都回滚select 1commit tran A    --提交整个事务信息
end try
begin catchselect 2rollback tran B_Point    --回滚事务点B_Point 即事务点下的部分都回滚commit tran A    --提交整个事务信息
end catch
goselect * from dbo.lives
go

SQL回滚局部信息时:

begin trybegin tran Ainsert into dbo.lives ( Eat, Play, Numb, times ) values ( 'A', '', 0, getdate() )--select 1/0    --错误信息save tran B_Pointinsert into dbo.lives ( Eat, Play, Numb, times ) values ( 'B', '', 0, getdate() )save tran C_Pointinsert into dbo.lives ( Eat, Play, Numb, times ) values ( 'C', '', 0, getdate() )rollback tran B_Point    --回滚事务点B_Point 即事务点下的部分都回滚select 1commit tran A    --提交整个事务信息
end try
begin catchselect 2rollback tran B_Point    --回滚事务点B_Point 即事务点下的部分都回滚commit tran A    --提交整个事务信息
end catch
goselect * from dbo.lives
go

回滚保存点B时 即保存点以下部分均要回滚,

注:使用保存点 无论try 或 catch 代码块 除提交或回滚保存点外,都要COMMIT或 ROLLBACK完整事务。

使用场景:当操作数据时前校验数据成本太高且数据出错率不高时 可采用.eg:用户下单 检查库存信息是否>0时 可以设置库存量需>=0的约束 当更新库时信息小于0即出错 进行事务回滚 并查询返回当前库存信息。

4、使用set xact_abort

设置 xact_abort on/off , 指定是否回滚当前事务,为on时如果当前sql出错,回滚整个事务,为off时如果sql出错回滚当前sql语句,其它语句照常运行读写数据库。

delete lives  --清空数据
set xact_abort off
begin tran --语句正确insert into lives (Eat,Play,Numb) values ('猪肉','足球',1)   --Numb为int类型,出错,如果1234..那个大数据换成'132dsaf' xact_abort将失效insert into lives (Eat,Play,Numb) values ('猪肉','足球',12345646879783213)--语句正确insert into lives (Eat,Play,Numb) values ('狗肉','篮球',3)
commit tran
select * from lives

为on时,结果集为空,因为运行是数据过大溢出出错,回滚整个事务。

SQL基础【十八、事物】(sql事物慎用,还是写业务逻辑代码好一些,入伙涉及到更换数据啥的很麻烦!)相关推荐

  1. SQL基础(八)-- sql左右连接中的on and 和 on where 的区别

    在使用left join时,on and和 where and条件的区别如下: 在使用链接时,先执行 on and,再执行  where and 1. on条件是在生成临时表时使用的条件,它不管on中 ...

  2. SQL基础【一、SQL简介】

    1:什么是SQL? A:SQL指结构化查询语句    B:SQL使我们有能力访问数据库     C:SQL是一种ANSI(美国国家标准化组织)的标准计算机语言 2:SQL能做什么? *面向数据库执行查 ...

  3. SQL基础教程 数据库和SQL

    目录 第一章  数据库和SQL 1-1 数据库是什么 一.数据库和数据库管理系统 二.DBMS的种类 1-2 数据库的结构 一.RDBMS的从常见系统结构 二.表的结构 1-3 SQL概要 一.SQL ...

  4. SQL基础【八、Insert】

    User表 插入一行数据 user_id为2 user_name为tom,user_age为12 注意:如果每一项都有插入的话就不需要在前面列出列名!! Insert into user values ...

  5. Mysql基础(十八):主从架构

    目录 1.MySQL的主从复制架构 2.主从复制架构的意义? 2.1.高可用架构 2.2.读写分离架构 从库的应用场景? 3.MySQL实现主从复制的工作原理 4.如何为MySQL搭建一套主从复制架构 ...

  6. SQL基础【二、SQL语法】

    注意:SQL对大小写不敏感!!! 1:SQL语句后面的分号 某些数据库系统要求在每条SQL命令的末端使用分号. 分号是在数据库系统中分隔每条SQL语句的标准方法,这样就可以在服务器的相同请求中执行一条 ...

  7. SQL基础总结(二):SQL基础

    本系列blog源自前年写的SQL学习笔记,汇总一下发上来. --------------------------------------------------------------- 标识符是可以 ...

  8. python_fullstack基础(十八)-并发编程

    并发编程 一.进程 1.理论背景 ①操作系统背景 手工操作-穿孔卡片  原理:用户独占计算机,CPU等待手工操作,资源利用和CPU利用效率极低 批处理-磁带处理.批处理系统  原理:主机与输入机之间增 ...

  9. Python基础(十八): 类和对象以及它们的属性

    一.类 最简单的经典类结构 class 类名:pass 复制代码 1.定义一个类 class Money:pass 复制代码 类名规范: 驼峰命名法, 并且首字母大写 2.实例化一个对象 创建一个对象 ...

最新文章

  1. 你拿什么保护我的版权(写在中移动MM商用之前)
  2. javascript 注意事项
  3. Java 8 - Optional全解
  4. CCF - 201703-1 - 分蛋糕
  5. oracle 存long,ORACLE中LONG类型字段的存取
  6. webconfig.xml文件golbalization节的作用
  7. c语言中常用函数名,C语言中一些常用函数的说明
  8. android截屏图片大小,Android截屏及图片解析
  9. 【转】地址线和数据线的计算
  10. stm32f103r6最小系统原理图_stm32f103c8t6封装及最小系统原理图
  11. DES加密解密Delphi、C#互通
  12. 计算机开机界面用户如何删除,电脑开机用户去掉登录界面方法
  13. 十大BI报表可视化工具
  14. vb UBound 数据上界
  15. left semi join 和 left join 区别
  16. 分类模型到底如何选择
  17. 暨南大学成人高考2021年招生简章
  18. WML语言基础(WAP建站)五
  19. 基站侧与核心网侧进行交互涉及PLMN和PLMN ID换算及其代码实现
  20. 磁矢位的引入 工程电磁场 P19

热门文章

  1. Python学习:numpy点乘,按元素相乘,以及转置的处理
  2. hashmap(1.8)
  3. 解决 SQL Server 耗尽内存的情况
  4. PIE SDK剔除栅格块算法
  5. 2019.7.25作业
  6. codeforces 922E
  7. HP Z240组建磁盘阵列RAID1
  8. Swift-闭包理解
  9. Mysql 索引的基础(下)
  10. VC中怎么读取.txt文件