第十一节:SQLServer事务写法、各种锁、事务隔离级别
一. 简介
1. 什么是事务
事务(Transaction)是由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元。
2. 事务的特征
事务具有 4 个基本特征,分别是:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Duration),简称:ACID。
(1).原子性:指事务必须是一个原子的操作序列单元。事务中包含的各项操作在一次执行过程中,只允许出现两种状态之一。 • 全部执行成功 • 全部执行失败,任何一项操作都会导致整个事务的失败,同时其它已经被执行的操作都将被撤销并回滚,只有所有的操作全部成功,整个事务才算是成功完成.
(2).一致性:事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处以一致性状态。比如:如果从 A 账户转账到 B 账户,不可能因为 A 账户扣了钱,而 B 账户没有加钱,无论 A 和 B 怎么转账,系统中总额是固定的,不可能因为 A 和 B 转账导致系统总额缺斤少两。
(3).隔离性:指在并发环境中,并发的事务是互相隔离的,一个事务的执行不能被其它事务干扰。也就是说,不同的事务并发操作相同的数据时,每个事务都有各自完整的数据空间。一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务是不能互相干扰的。(详见下面隔离级别)
(4).持久性:事务的持久性是指事务一旦提交后,数据库中的数据必须被永久的保存下来。即使服务器系统崩溃或服务器宕机等故障。只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态。
3. SQLServer中事务的写法
--写法1 begin transaction begin try insert into RoleInfor values(‘角色1‘,‘角色描述1‘,‘2020-12-05‘); insert into RoleInfor values(‘角色1‘,‘xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx‘,‘2020-12-05‘); --模拟错误,roleDescirption类型varchar(50) commit transaction end try begin catch rollback transaction end catch --写法2 begin transaction declare @myError int; --自定义变量 set @myError=0; insert into RoleInfor values(‘角色1‘,‘角色描述1‘,‘2020-12-05‘); set @myError=@myError+@@ERROR; insert into RoleInfor values(‘角色1‘,‘xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx‘,‘2020-12-05‘); --模拟错误,roleDescirption类型varchar(50) set @myError=@myError+@@ERROR; if @myError>0 begin rollback transaction end else begin commit transaction end
二. 数据库锁、事务隔离级别、死锁
从数据库角度介绍各种锁和事务隔离级别:https://www.cnblogs.com/yaopengfei/p/9762267.html (该节有点问题,复习的时候重新整理一下)
从EFCore调用的角度介绍事务隔离解蔽: https://www.cnblogs.com/yaopengfei/p/11394728.html
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。