数据库为什么要用事务?

数据库为什么要用事务?,第1张

所谓事务是用户定义的一个数据库 *** 作序列,这些 *** 作要么全做要么全不做,是一个不可分割的工作单位。例如,在关系数据库中,一个事务可以是一条SQL语句、一组SQL语句或整个程序。

简单举个例子就是你要同时修改数据库中两个不同表的时候,如果它们不是一个事务的话,当第一个表修改完,可是第二表改修出现了异常而没能修改的情况下,就只有第二个表回到未修改之前的状态,而第一个表已经被修改完毕。

而当你把它们设定为一个事务的时候,当第一个表修改完,可是第二表改修出现了异常而没能修改的情况下,第一个表和第二个表都要回到未修改的状态!这就是所谓的事务回滚。例如,在将资金从一个帐户转移到另一个帐户的银行应用中,一个帐户将一定的金额贷记到一个数据库表中,同时另一个帐户将相同的金额借记到另一个数据库表中。由于计算机可能会因停电、网络中断等而出现故障,因此有可能更新了一个表中的行,但没有更新另一个表中的行。如果数据库支持事务,则可以将数据库 *** 作组成一个事务,以防止因这些事件而使数据库出现不一致。如果事务中的某个点发生故障,则所有更新都可以回滚到事务开始之前的状态。如果没有发生故障,则通过以完成状态提交事务来完成更新。

在 ADO.NET 中,可以使用 Connection 和 Transaction 对象来控制事务。可以使用 Connection.BeginTransaction 启动本地事务。一旦开始一个事务,就可以使用 Command 对象的 Transaction 属性在该事务中登记命令。然后,可以根据事务组件的成功或失败情况,使用 Transaction 对象提交或回滚在数据源中所做的修改。

MySQL 事务

什么是事务?

MySQL 事务主要用于处理 *** 作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库 *** 作语句就构成一个事务!

在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。

事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。

事务用来管理 insert,update,delete 语句

一般来说,事务是必须满足4个条件(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。

原子性:一个事务(transaction)中的所有 *** 作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT *** 作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。

from 树懒学堂 - 一站式数据知识平台

在做性能测试的时候,有些 *** 作或请求是逻辑上依赖相关的一个整体,不可分割或者是为了方便度量我们关注的一组 *** 作或请求的性能,将要将其看做一个整体。

基于这些原因,我们把这些 *** 作或请求放在一个事务控制器下。

事务控制类似于简单控制器,不仅提供了元素分组的功能除此之外,还可以度量其包含的所有测试元素执行的响应时间。

只有当事务控制器所有的取样器都成功时,事务控制器才成功。

使用事务控制器的典型场合:

1.当要度量生成某个页面的整体性能时,不仅考虑页面请求本身,还需要考虑完成页面渲染所需要的image、CSS、js等资源,因为请求这些数据也会消耗系统,网络等资源。

故需要页面请求与资源请求看做一个整体,放在一个事务控制器下

2.在做API或接口性能测试时,接口之间存在逻辑依赖关系,后一个接口会引用前面接口返回的结果,故需要将这些接口看成一个整体,放在一个事务控制器下,度量性能才能接近真实场景

3.在前面的请求服务器返回了token,后面的请求需要使用token,这些请求有逻辑上的依赖关系,需要看成一个整体,放在一个事务控制器下。

▲ 配置项

● Generate parent sample:

若勾选此项,在聚合报告等监听器中只显示事务控制器本身的数据,不会显示其下的每一个取样器请求的数据反之,则会显示事务控制器和其下的所有取样器的数据。

事务控制器有两种模式的 *** 作:

1.事务控制器额外生成的取样器添加在其下所有的取样器后面

2.事务控制器额外生成的取样器作为其下所有的取样器的父取样器。称之为父模式。

不选(默认)是以模式1 *** 作勾选则以模式2 *** 作。

若以父模式 *** 作,断言等可以被添加到事务控制器下,默认情况下会作用于事务控制器下的每一个单独的取样器以及整个事务取样器。为了限制断言的范围,可以考虑将多个取样器和断言同时放在同一个简单控制器下。

● Include duration of timer and pre-post processors in generated sample:

事务控制器生成一个额外的取样器,用于测量执行嵌套测试元素所花费的总时间。默认不包含内嵌其中的定时器与前/后置处理耗费的时间。若勾选此项,则包含事务控制器下所有元素的处理时间。

▲ 登录步骤

这里以ECshop前台系统登录为例。

s1.直接访问ECshop前台系统登录页面

s2.在登录页面输入用户名及密码,点击登录

s3.跳转到网站首页。

可以将步骤s1、s2、s3对应的 *** 作看做一个事务。

▲ 运行结果

具体 *** 作较简单,不再细讲。

1.先以非父模式运行,查看结果树与聚合报告如下:

2.以父模式运行,查看结果树与聚合报告如下:


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/9916895.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存