SQLServer之事务简介

事务定义

事务是单个的工作单元。事务是在数据库上按照一定的逻辑顺序执行的任务序列,既可以由用户手动执行,也可以由某种数据库程序自动执行。

事务分类

自动提交事务

每条单独的语句都是一个事务。

在自动提交模式下, 每个数据库操作是在执行时已提交的事务。 此模式适合用于包含单个 SQL 语句的许多实际的事务。 不需要分隔,或者指定的这些事务完成。 在数据库中不支持事务的情况下,自动提交模式是唯一支持的模式。 在此类数据库语句仅在提交后可以执行它们并没有方法回滚它们;它们因此始终处于自动提交模式。

如果遵循基础 DBMS 不支持自动提交模式下事务,该驱动程序可以模拟它们通过手动提交每个 SQL 语句,因为它执行。

如果在自动提交模式下执行一批 SQL 语句,则它是数据源特定的语句批处理中提交时。 它们可以是已提交会在执行时或作为一个整体后执行整个批处理。 某些数据源可能支持这两个这些行为,并且可能会提供一种方法选择一个或其他人。 具体而言,如果批处理过程中发生错误,则数据源特定于已执行语句是提交还是回滚。 因此,使用批次,且需要它们来提交或回滚作为一个整体的可互操作应用程序应仅在手动提交模式下执行批处理。

显式事务

每个事务均以 BEGIN TRANSACTION 语句显式开始,以 COMMIT 或 ROLLBACK 语句显式结束。

隐式事务

在前一个事务完成时新事务隐式启动,但每个事务仍以 COMMIT 或 ROLLBACK 语句显式完成。

隐式事务通过设置SET IMPLICIT_TRANSACTIONS  ON 语句,将隐性事务模式设置为打开。

事务特性

事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有四个属性,称为原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)属性,只有这样才能成为一个事务。

原子性

事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。

一致性

事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。

隔离性

由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务识别数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是第二个事务修改它之后的状态,事务不会识别中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。

持久性

事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。

事务隔离

隔离级别用于决定如何控制并发用户读写数据的操作。

读操作默认使用共享锁;写操作需要使用排它锁。

读操作能够控制他的处理的方式,写操作不能控制它的处理方式。

可序列化性

理想情况下,事务应可序列化。 事务被视为可用作按顺序运行它们的结果的同时运行的事务的结果是相同的情况下序列化 — 即,另一个。 它并不重要的事务,则首先执行,仅的结果不会反映任何混合的事务。

事务隔离级别

事务隔离级别隔离成功事务的范围内的一种度量值。 具体而言,事务隔离级别定义由存在以下现象:

  • 脏读A脏读事务读取尚未提交的数据时发生。 例如,假设事务 1 更新行。 事务 2 在事务 1 提交更新之前读取更新的行。 如果事务 1 回滚更改,将具有事务 2 读取永远不会视为已存在于数据。

  • 不可重复读取A不可重复读事务两次读取同一行,但每次获取不同的数据时发生。 例如,假设事务 1 读取某行。 事务 2 更新或删除该行并提交 update 或 delete。 如果事务 1 重新读取行,它将检索不同的行值或发现该行已被删除。

  • 幻影A幻像是与搜索条件匹配,但是最初未检测到的行。 例如,假设事务 1 读取一组满足某些搜索条件的行。 事务 2 生成一个新行 (通过更新或插入) 事务 1 搜索条件相匹配。 如果事务 1 reexecutes 读取这些行的语句,它获取一组不同的行。

  • 更新丢失,两个事务同时更新,但由于某一个事务更新失败发生回滚操作,这样有可能的结果就是第二个事务已更新的数据因为第一个事务发生回滚而导致数据最终没有发生更新,因此两个事务的更新都失败了。

根据这些现象定义四个事务隔离级别 (如 SQL-92 所定义)。 下表中"X"将标记每个可能发生的现象。

事务隔离级别可能的实现

未提交读

事务不是相互隔离的。 如果 DBMS 支持其他事务隔离级别,它会忽略它使用来实现这两种级别的任何机制。 以便它们不产生不利影响其他事务,在 Read Uncommitted 级别运行的事务是通常是只读的。

已提交读

在事务等待,直到由其他事务写入锁定的行不会被锁定;这可以防止它读取任何"更新"的数据。
事务持有读取的锁 (如果它仅读取行) 或写入锁定 (如果它更新或删除的行) 的当前行,以防止其他事务更新或删除它。 事务释放读的锁时即会关闭当前行。 它保留写锁,直到提交或回滚。

可重复读

在事务等待,直到由其他事务写入锁定的行不会被锁定;这可以防止它读取任何"更新"的数据。
事务持有读取的锁,它返回到的应用程序和写锁,它插入、 更新或删除的所有行的所有行。 例如,如果事务包含的 SQL 语句选择*从订单,如应用程序读取它们的事务读取锁定行。 如果在事务中包含的 SQL 语句删除从订单的状态 = 已关闭,如将其删除的行事务写入锁。
由于其他事务不能更新或删除这些行,当前事务可以避免任何不可重复读取。 事务提交或回滚时释放其锁。

可序列化

在事务等待,直到由其他事务写入锁定的行不会被锁定;这可以防止它读取任何"更新"的数据。
事务持有读取的锁 (如果它仅读取的行) 或写入锁 (如果它可以更新或删除行) 的范围上它的行影响。 例如,如果事务包含的 SQL 语句选择*从订单,范围是整个 Orders 表; 事务读取锁定表而不会允许任何新行插入到它。 如果在事务中包含的 SQL 语句删除从订单的状态 = 已关闭,范围为"已关闭"状态的所有行; 事务写入锁订单中的所有行具有都表状态为"CLOSED"而不会不允许任何行要插入或更新,以便得到的行的状态为"已关闭"。
由于其他事务不能更新或删除范围中的行,当前事务可以避免任何不可重复读取。 由于其他事务不能在范围中插入任何行,当前事务可以避免任何幻影。 事务提交或回滚时释放其锁定。

设置事务隔离级别

若要设置事务隔离级别,应用程序,请使用 SQL_ATTR_TXN_ISOLATION 连接属性。 如果数据源不支持所请求的隔离级别,则驱动程序或数据源可以设置更高的级别。 若要确定哪些事务隔离级别的数据源支持和默认隔离级别是,应用程序调用SQLGetInfoSQL_TXN_ISOLATION_OPTION 和 SQL_DEFAULT_TXN_ISOLATION 选项分别。

更高版本的事务隔离级别提供数据库数据的大多数完整性的保护。 可序列化事务都保证是不受其他事务的影响,因此保证维护数据库的完整性。

但是,更高版本的事务隔离级别可能导致性能下降,因为它增加了应用程序必须等待锁释放的数据的可能性。 应用程序可以指定较低级别的隔离,以提高性能,在以下情况下:

  • 当它可以保证其他任何事务存在,可能会影响应用程序的事务。 这种情况仅在有限的情况下,如小型公司中的某个人时维护 dBASE 文件包含一台计算机上的人员数据中发生,不会共享这些文件。

  • 当速度比准确性和任何错误很可能是小型更为重要。 例如,假设一家公司,使得许多小型销售和大单销售很少。 估计总销售额值中所有打开的事务可以安全地使用 Read Uncommitted 隔离级别。 尽管该事务将包含订单是得到打开或关闭,随后可以回滚,这些将通常相互抵消,事务会快得多,因为它不会阻止每次它遇到这种订单。

可滚动游标和事务隔离

下表列出了用于管理更改的可见性的因素。

所做的更改:可见性取决于:
游标游标类型,游标实现
同一个事务中的其他语句游标类型
在其他事务中的语句游标类型,事务隔离级别

 

 

 

 

 

 

下表总结了每种游标类型能够检测所本身、 其自己的事务中的其他操作和其他事务所做的更改。 后一种更改的可见性取决于游标类型和包含光标的事务的隔离级别。

 

[a] 中括号的字母指示包含游标的事务的隔离级别(在其中进行了更改) 的其他事务的隔离级别是不相关。

RU: 未提交的读

RC: 已提交读

RR: 可重复读

S: 可序列化

[b] 依赖于如何实现游标。 光标是否可以检测此类更改通过中的 SQL_STATIC_SENSITIVITY 选项将报告SQLGetInfo。

事务支持

SQL Server 的 OLE DB 驱动程序实现本地事务的支持。 使用者可借助 Microsoft 分布式事务处理协调器 (MS DTC) 来使用分布式事务或协调事务。 对于需要跨多个会话的事务控制权的使用者,适用于 SQL Server 的 OLE DB 驱动程序可以加入由 MS DTC 启动和维护的事务。

默认情况下,适用于 SQL Server 的 OLE DB 驱动程序使用自动提交事务模式,其中对使用者会话执行的每次离散操作均包含一个针对 SQL Server 实例的完整事务。 适用于 SQL Server 的 OLE DB 驱动程序的自动提交模式是本地的,并且自动提交事务从不会跨多个会话。

适用于 SQL Server 的 OLE DB 驱动程序公开 ITransactionLocal 接口,并允许使用者在 SQL Server 实例的单个连接上使用显式和隐式启动事务。 SQL Server 的 OLE DB 驱动程序不支持嵌套本地事务。

事务应用场景

确保数据完整、安全、一致性。

确保线程之间操作不会相互影响。

事务优点

原子性、一致性、持久性通过数据库日志实现。

批处理数据库操作。

保证数据库级联操作的正确性。

事务缺点

执行较慢。

需要较多的磁盘空间保存事务日志。

执行更新需要内存较多。

 

转载于:https://www.cnblogs.com/vuenote/p/9913845.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/412910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[css] 用css怎么实现两端对齐?

[css] 用css怎么实现两端对齐&#xff1f; 文本的两端对齐<style>.form .text {display: inline-block;width: 65px;text-align-last: justify;}</style><div class"form"><div><span class"text">用户名</span><i…

springboot mybatis mysql8.0 异常 invalid bound statement (not found)(汇总篇)

大家好&#xff0c;我是烤鸭&#xff1a; 现在是采坑实录。 invalid bound statement (not found) 这个坑用过mybatis的人肯定都踩过。 1. 环境 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</ar…

Vmware centos无法连接网络

在vmware下安装了centos7&#xff0c;桥接模式&#xff0c;无法连接网络 解决方案一&#xff1a; 然后重启虚拟机 解决方案二&#xff1a; 然后再试试重启能否联网 解决方案三&#xff1a;

[css] 你有用过弹性布局吗?说说你对它的理解

[css] 你有用过弹性布局吗&#xff1f;说说你对它的理解 按我的经验在样式规律上大致分下类吧&#xff0c;等宽弹性布局单元素弹性布局多元素定比弹性布局等隙布局用 flex 或 grid 能非常轻松的完成以上效果&#xff0c;而 css2 时代多半还需要更多元素嵌套才能完成了。所谓弹…

洛谷P2015 二叉苹果树

题目描述 有一棵苹果树&#xff0c;如果树枝有分叉&#xff0c;一定是分2叉&#xff08;就是说没有只有1个儿子的结点&#xff09; 这棵树共有N个结点&#xff08;叶子点或者树枝分叉点&#xff09;&#xff0c;编号为1-N,树根编号一定是1。 我们用一根树枝两端连接的结点的编号…

mybatis 一对一 一对多 级联查询

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一下关于mybatis的级联查询。 环境&#xff1a; mybatis 3.2.8 spring 4.1.9 1. 业务场景 在一个人申请某些账号或者权限的时候&#xff0c;比如微信的认证流程。 会让你一步一步按要求输入&#xff0c;比如第一步&am…

IDEA启动tomcat报错java.util.zip.ZipException: error in opening zip file

原因CATALINA_BASE参数后面多了一个斜杠 将&#xff1a;CATALINA_BASEK:\Tomcats\apache-tomcat-9.0.10_cform\ 改&#xff1a;CATALINA_BASEK:\Tomcats\apache-tomcat-9.0.10_cform

[css] 外边距重叠是什么?重叠的结果是什么?怎么防止外边距重叠?

[css] 外边距重叠是什么&#xff1f;重叠的结果是什么&#xff1f;怎么防止外边距重叠&#xff1f; 外边距重叠是什么&#xff1f;外边距重叠指的是&#xff0c;当两个垂直外边距相遇时&#xff0c;它们将形成一个外边距。 重叠后的外边距的高度等于两个发生重叠的外边距的高度…

JavaScript计算两个日期相差天数/分钟/小时

/*** 日期相减获取天数&#xff08;用于公式计算&#xff09;* param date1 日期一 例如:"{value:2020-06-05,date_format:yyyy-MM-dd}"* param date2 日期二 例如:"{value:2020-06-04,date_format:yyyy-MM-dd}"* returns {string}*/ function calcDateDay…

java 实现 常见排序算法(二) 插入排序

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一下基础排序算法之直接插入排序。 1. 直接插入排序&#xff1a; 原理&#xff1a;假设前面的数为有序数列&#xff0c;然后有序数列与无序数列的每个数比较&#xff0c;我们可以从右向左比较 思路&#xff1a;从第2…

[css] css中的border:none和border:0px有什么区别?

[css] css中的border:none和border:0px有什么区别&#xff1f; none是没有边框. 0px是边框的宽度为0px.个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

linux 常用 启动命令 汇总

大家好&#xff0c;我是烤鸭&#xff1a; 没有准备启动脚本。服务器出问题之后&#xff0c;重启就是全部重启。 如&#xff1a; mysql,nginx,tomcat,zookeeper,rabbitmq,mongodb,redis,xxxxx 头大。持续更新。。。 consul启动&#xff1a; (公网可以访问 使用-client 0.0.0…

Error:Artifact com.*******:war exploded: java.nio.file.InvalidPathException: Illeg

由于一次电脑蓝屏&#xff0c;Idea启动tomcat报错: Error:Artifact :war exploded’: java.nio.file.InvalidPathException: Illegal char < > at index 71: K:\COMPANY_CODE_IDEA\FLOW_CODE*\target\activ : Illegal char < > at index 71: K:\COMPANY_CODE_IDEA…

[css] 如何写高效的CSS?

[css] 如何写高效的CSS&#xff1f; 唔&#xff0c;自动补全、预编译这些辅助手段确实能提升一定的效率&#xff0c; 但我觉得真正能提升效率的是&#xff0c;不看预览就敢上手的理论知识。 见过太多加几行就要预览下效果的开发了&#xff0c;哪怕给他双屏其实也还是会拖慢节奏…

React 在body上绑定事件以及阻止事件冒泡

<!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>React 在body上绑定事件以及阻止事件冒泡</title><script src"https://unpkg.com/react16/umd/react.development.js"></script><script …

[css] 如何做图片预览,如何放大一个图片?

[css] 如何做图片预览&#xff0c;如何放大一个图片&#xff1f; 图片不跨域的话用 canvas 来 drawImage 放大裁剪也可以。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前…

java 爬虫 抓取 网易云音乐

大家好&#xff0c;我是烤鸭&#xff1a; 今天和大家交流一下爬虫&#xff0c;抓取网易云音乐。只讨论技术&#xff0c;不提倡其他的。 1. 找音乐源地址 谷歌浏览器 F12 &#xff0c;找请求类型是 Media的。 2. 找请求链接 切换请求类型到 All&#xff0c;看 Respons…

idea警告Cannot resolve MVC View

关闭MVC View路径检查,Settings --> Editor -->Inspections -->搜索Spring MVC View—>取消勾选Spring MVC View Reference

[css] 举例说明在css3中怎么实现背景裁剪?

[css] 举例说明在css3中怎么实现背景裁剪&#xff1f; background-clip: border-box(默认,背景延伸至边框外沿,但是在边框的下层) padding-box(背景延伸至padding的外沿) content-box(背景延伸至内容的外沿) text(背景剪裁成文字的样式)个人简介 我是歌谣&#xff0c;欢迎和大…

django 模型类的常见字段约束,以及filter 过滤和查询

null 不设置时默认设置为False。设置为True时&#xff0c;数据库表字段中将存入NULL的记录。 null和blank组合使用&#xff0c;nullTrue,blankTrue,表示该字段可以为空 blank 默认设置为False。设置为True时&#xff0c;表字段许可无任何输入。设置为False 时&#xff0c;表字段…