当前位置:首页 » 数据仓库 » 数据库事务安全性
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

数据库事务安全性

发布时间: 2022-04-20 16:37:40

㈠ 如何理解数据库事务一致性

定义:数据库一致性(database
consistency)是指事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
数据库状态如何变化?每一次数据变更就会导致数据库的状态迁移。如果数据库的初始状态是c0,第一次事务t1的提交就会导致系统生成一个system
change
number(scn),这是数据库状态从c0转变成c1。执行第二个事务t2的时候数据库状态从t1变成t2,以此类推,执行第tn次事务的时候数据库状态由c(n-1)变成cn。
定义一致性主要有2个方面,一致读和一致写。
一致写:事务执行的数据变更只能基于上一个一致的状态,且只能体现在一个状态中。t(n)的变更结果只能基于c(n-1),c(n-2),
...c(1)状态,且只能体现在c(n)状态中。也就是说,一个状态只能有一个事务变更数据,不允许有2个或者2个以上事务在一个状态中变更数据。至于具体一致写基于哪个状态,需要判断t(n)事务是否和t(n-1),t(n-2),...t(1)有依赖关系。
一致读:事务读取数据只能从一个状态中读取,不能从2个或者2个以上状态读取。也就是t(n)只能从c(n-1),c(n-2)...
c(1)中的一个状态读取数据,不能一部分数据读取自c(n-1),而另一部分数据读取自c(n-2)。
摆事实
一致写:
定义100个事务t(1)...t(100)实现相同的逻辑
update
table
set
i=i+1,i的初始值是0,那么并发执行这100个事务之后i的值是多少?可能很容易想到是100。那么怎么从一致性角度去理解呢?
数据库随机调度到t(50)执行,此时数据库状态是c(0),而其它事务都和t(50)有依赖关系,根据写一致性原理,其它事务必须等到t(50)执行完毕后数据库状态变为c(1)才可以执行。因此数据库利用锁机制阻塞其它事务的执行。直到t(50)执行完毕,数据库状态从c(0)迁移到c(1)。数据库唤醒其它事务后随机调度到t(89)执行,以此类推直到所有事务调度执行完毕,数据库状态最终变为c(100)。
一致读:
还是上面的例子,假设t(1)...t(100)顺序执行,在不同的时机执行select
i
from
table,我们看到i的值是什么?
1.
t(1)的执行过程中。数据库状态尚未迁移,读到的i=0
2.
t(1)执行完毕,t(2)的执行过程中,数据库状态迁移至c(1),读到的i=1

㈡ 关系数据库事务的特性是什么

关系数据库事务(DatabaseTransaction)是指一个可以包含多个步骤来完成所需要的任务的工作单元。通过事务将一系列不可分割的数据库操作作为一个整体来执行,从而保证了数据库的完整性和有效性。其包含了一组数据库操作命令的一个操作序列,事务中所有命令作为一个整体向系统提交或撤销操作请求(要么完全执行,要么完全不执行,即数据库命令系列要么都成功,要么都不成功)。

2.1.1事务特性数据库事务必须具备ACID特性,一个逻辑工作单元要成为事务,必须满足ACID属性。

ACID是指Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性)。事务由数据库管理系统(DBMS)中的事务管理子系统负责处理。

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

2.一致性一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。如果事务成功完成,那么系统中所有变化将正确地应用,系统处于有效状态。如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。

3.隔离性隔离性指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。

4.持久性持久性指的是只要事务成功结束,它对数据库所做的更新就必须永久地保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。

㈢ 数据库事务原子性,一致性是怎样实现的

原子性:一个事务内的所有sql操作是一个整体。都执行成功才算整个事务成功。如果某个失败,则必须要会退到事务执行之前的状态,执行成功的SQL需要被撤销。
innodb通过undo log和redo log来实现。
事务中,每当执行一条SQL语句对数据产生了影响,就会记录下来与之相反的操作到undo log(撤销日志)中,例如,更新会记录之前的状态,删除会形成insert,添加会形成delete,一旦事务被回滚,则执行undo log中记录的操作,来完成恢复到之前的状态。这里是个 逻辑恢复哦!同时,每当执行一条事务中的SQL,会将操作记录到redo log中,此时事务一旦被提交,就将该redolog中的操作,持久化到磁盘上,数据就持久的记录下来了(ACID的D)。
PS:还有,undolog才是原子性的关键。提供redolog,应该主要目的是提升磁盘的IO开销吧,如果直接写入磁盘,IO开销,会很大。如果先将操作记录到redolog中,可以顺序的记录,批量的记录,再一起同步到磁盘上,速度会比直接写磁盘快些。 mysql在生成redolog时,会使用 innodb log buffer,先缓冲到内存中,再同步到redolog上,速度会更快。
另外关于,一致性,应该是个整体概念,保证所有的mysql对象(数据,索引,约束,日志,用户)在事务执行前后都具有完整的特性,应该是mysql所有的功能都为此服务吧!

㈣ 数据库安全事务 可以在客户端执行吗

数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。事务是数据库运行中的一个逻辑工作单位,由DBMS中的事务管理子系统负责事务的处理。

㈤ “数据库中的事务”是什么

数据库事务(Database Transaction) ,事务是一系列作为一个逻辑单元来执行的操作集合。它是数据库维护数据一致性的单位,它将数据库从一致状态转变为新的一致状态,指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。事务是数据库运行中的逻辑工作单位,由DBMS中的事务管理子系统负责事务的处理。

㈥ 数据库事务四大特性是什么

1、原子性(Atomicity)

原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

2、 一致性(Consistency)

一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

3、隔离性(Isolation)

隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

4、持久性(Durability)

持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

(6)数据库事务安全性扩展阅读

在数据库中,关于读数据的概念:

1、脏读(Dirty Reads):所谓脏读就是对脏数据(Drity Data)的读取,而脏数据所指的就是未提交的数据。也就是说,一个事务正在对一条记录做修改,在这个事务完成并提交之前,这条数据是处于待定状态的(可能提交也可能回滚)。

这时,第二个事务来读取这条没有提交的数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被称为脏读。

2、不可重复读(Non-Repeatable Reads):一个事务先后读取同一条记录,但两次读取的数据不同,我们称之为不可重复读。也就是说,这个事务在两次读取之间该数据被其它事务所修改。

3、幻读(Phantom Reads):一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为幻读。

㈦ 为了保障数据的完整性、安全性和一致性,需要把对数据库的操作划分为“事务”的基本单位,一个事物要么全

这句话是对的。
你可以这么理解事务,即一个一连串动作。如果一个动作做完整了(all)就结束这个操作。如果做了一半出错了或者其他原因没有做完,就回滚了(nothing),什么也不做,到原始状态了。就像楼上所说的取钱没有完成,卡机了,就回滚回去了。这样就保证了你的卡上的金额是完整的、安全的、一致的。

㈧ 数据库事务隔离级别 一般用哪个

术式之后皆为逻辑,一切皆为需求和实现。希望此文能从需求、现状和解决方式的角度帮大家理解隔离级别。


隔离级别的产生

在串型执行的条件下,数据修改的顺序是固定的、可预期的结果,但是并发执行的情况下,数据的修改是不可预期的,也不固定,为了实现数据修改在并发执行的情况下得到一个固定、可预期的结果,由此产生了隔离级别。

所以隔离级别的作用是用来平衡数据库并发访问与数据一致性的方法。


事务的4种隔离级别

READ UNCOMMITTED 未提交读,可以读取未提交的数据。READ COMMITTED 已提交读,对于锁定读(select with for update 或者 for share)、update 和 delete 语句, InnoDB 仅锁定索引记录,而不锁定它们之间的间隙,因此允许在锁定的记录旁边自由插入新记录。 Gap locking 仅用于外键约束检查和重复键检查。REPEATABLE READ 可重复读,事务中的一致性读取读取的是事务第一次读取所建立的快照。SERIALIZABLE 序列化

在了解了 4 种隔离级别的需求后,在采用锁控制隔离级别的基础上,我们需要了解加锁的对象(数据本身&间隙),以及了解整个数据范围的全集组成。


数据范围全集组成

SQL 语句根据条件判断不需要扫描的数据范围(不加锁);

SQL 语句根据条件扫描到的可能需要加锁的数据范围;

以单个数据范围为例,数据范围全集包含:(数据范围不一定是连续的值,也可能是间隔的值组成)

1. 数据已经填充了整个数据范围:(被完全填充的数据范围,不存在数据间隙)

  • 整形,对值具有唯一约束条件的数据范围 1~5 ,

    已有数据1、2、3、4、5,此时数据范围已被完全填充;

  • 整形,对值具有唯一约束条件的数据范围 1 和 5 ,

    已有数据1、5,此时数据范围已被完全填充;

  • 2. 数据填充了部分数据范围:(未被完全填充的数据范围,是存在数据间隙)

  • 整形的数据范围 1~5 ,

    已有数据 1、2、3、4、5,但是因为没有唯一约束,

    所以数据范围可以继续被 1~5 的数据重复填充;

  • 整形,具有唯一约束条件的数据范围 1~5 ,

    已有数据 2,5,此时数据范围未被完全填充,还可以填充 1、3、4 ;

  • 3. 数据范围内没有任何数据(存在间隙)

    如下:

  • 整形的数据范围 1~5 ,数据范围内当前没有任何数据。

  • 在了解了数据全集的组成后,我们再来看看事务并发时,会带来的问题。

    无控制的并发所带来的问题

    并发事务如果不加以控制的话会带来一些问题,主要包括以下几种情况。

    1. 范围内已有数据更改导致的:

  • 更新丢失:当多个事务选择了同一行,然后基于最初选定的值更新该行时,

    由于每个事物不知道其他事务的存在,最后的更新就会覆盖其他事务所做的更新;

  • 脏读: 一个事务正在对一条记录做修改,这个事务完成并提交前,这条记录就处于不一致状态。

    这时,另外一个事务也来读取同一条记录,如果不加控制,

    第二个事务读取了这些“脏”数据,并据此做了进一步的处理,就会产生提交的数据依赖关系。

    这种现象就叫“脏读”。

  • 2. 范围内数据量发生了变化导致:

  • 不可重复读:一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,

    却发现其读出的数据已经发生了改变,或者某些记录已经被删除了。

    这种现象就叫“不可重复读”。

  • 幻读:一个事务按相同的查询条件重新读取以前检索过的数据,

    却发现其他事务插入了满足其查询条件的新数据,这种现象称为“幻读”。

    可以简单的认为满足条件的数据量变化了。

  • 因为无控制的并发会带来一系列的问题,这些问题会导致无法满足我们所需要的结果。因此我们需要控制并发,以实现我们所期望的结果(隔离级别)。

    MySQL 隔离级别的实现

    InnoDB 通过加锁的策略来支持这些隔离级别。

    行锁包含:

  • Record Locks

    索引记录锁,索引记录锁始终锁定索引记录,即使表中未定义索引,

    这种情况下,InnoDB 创建一个隐藏的聚簇索引,并使用该索引进行记录锁定。

  • Gap Locks

    间隙锁是索引记录之间的间隙上的锁,或者对第一条记录之前或者最后一条记录之后的锁。

    间隙锁是性能和并发之间权衡的一部分。

    对于无间隙的数据范围不需要间隙锁,因为没有间隙。

  • Next-Key Locks

    索引记录上的记录锁和索引记录之前的 gap lock 的组合。

    假设索引包含 10、11、13 和 20。

    可能的next-key locks包括以下间隔,其中圆括号表示不包含间隔端点,方括号表示包含端点:

  • (负无穷大, 10] (10, 11] (11, 13] (13, 20] (20, 正无穷大) 对于最后一个间隔,next-key将会锁定索引中最大值的上方,


  • 左右滑动进行查看

    "上确界"伪记录的值高于索引中任何实际值。

    上确界不是一个真正的索引记录,因此,实际上,这个 next-key 只锁定最大索引值之后的间隙。

    基于此,当获取的数据范围中,数据已填充了所有的数据范围,那么此时是不存在间隙的,也就不需要 gap lock。

    对于数据范围内存在间隙的,需要根据隔离级别确认是否对间隙加锁。

    默认的 REPEATABLE READ 隔离级别,为了保证可重复读,除了对数据本身加锁以外,还需要对数据间隙加锁。

    READ COMMITTED 已提交读,不匹配行的记录锁在 MySQL 评估了 where 条件后释放。

    对于 update 语句,InnoDB 执行 "semi-consistent" 读取,这样它会将最新提交的版本返回到 MySQL,

    以便 MySQL 可以确定该行是否与 update 的 where 条件相匹配。

    总结&延展:

    唯一索引存在唯一约束,所以变更后的数据若违反了唯一约束的原则,则会失败。

    当 where 条件使用二级索引筛选数据时,会对二级索引命中的条目和对应的聚簇索引都加锁;所以其他事务变更命中加锁的聚簇索引时,都会等待锁。

    行锁的增加是一行一行增加的,所以可能导致并发情况下死锁的发生。

    例如,

    在 session A 对符合条件的某聚簇索引加锁时,可能 session B 已持有该聚簇索引的 Record Locks,而 session B 正在等待 session A 已持有的某聚簇索引的 Record Locks。

    session A 和 session B 是通过两个不相干的二级索引定位到的聚簇索引。

    session A 通过索引 idA,session B通过索引 idB 。

    当 where 条件获取的数据无间隙时,无论隔离级别为 rc 或 rr,都不会存在间隙锁。

    比如通过唯一索引获取到了已完全填充的数据范围,此时不需要间隙锁。

    间隙锁的目的在于阻止数据插入间隙,所以无论是通过 insert 或 update 变更导致的间隙内数据的存在,都会被阻止。

    rc 隔离级别模式下,查询和索引扫描将禁用 gap locking,此时 gap locking 仅用于外键约束检查和重复键检查(主要是唯一性检查)。

    rr 模式下,为了防止幻读,会加上 Gap Locks。

    事务中,SQL 开始则加锁,事务结束才释放锁。

    就锁类型而言,应该有优化锁,锁升级等,例如rr模式未使用索引查询的情况下,是否可以直接升级为表锁。

    就锁的应用场景而言,在回放场景中,如果确定事务可并发,则可以考虑不加锁,加快回放速度。

    锁只是并发控制的一种粒度,只是一个很小的部分:

    从不同场景下是否需要控制并发,(已知无交集且有序的数据的变更,MySQL 的 MTS 相同前置事务的多事务并发回放)

    并发控制的粒度,(锁是一种逻辑粒度,可能还存在物理层和其他逻辑粒度或方式)

    相同粒度下的优化,(锁本身存在优化,如IX、IS类型的优化锁)

    粒度加载的安全&性能(如获取行锁前,先获取页锁,页锁在执行获取行锁操作后即释放,无论是否获取成功)等多个层次去思考并发这玩意。

㈨ 请简单介绍一下数据库事务的4大特性

事务的:原子性、一致性、分离性、持久性
原子性、一致性、分离性、持久性
(1) 原子性
事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。这种特性称为原子性。
事务的原子性要求,如果把一个事务可看作是一个程序,它要么完整的被执行,要么完全不执行。就是说事务的操纵序列或者完全应用到数据库或者完全不影响数据库。这种特性称为原子性。
假如用户在一个事务内完成了对数据库的更新,这时所有的更新对外部世界必须是可见的,或者完全没有更新。前者称事务已提交,后者称事务撤消(或流产)。DBMS必须确保由成功提交的事务完成的所有操纵在数据库内有完全的反映,而失败的事务对数据库完全没有影响。

(2) 一致性
事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。这种特性称为事务的一致性。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。
一致性处理数据库中对所有语义约束的保护。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。例如,当数据库处于一致性状态S1时,对数据库执行一个事务,在事务执行期间假定数据库的状态是不一致的,当事务执行结束时,数据库处在一致性状态S2。

(3) 分离性
分离性指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到。
分离性是DBMS针对并发事务间的冲突提供的安全保证。DBMS可以通过加锁在并发执行的事务间提供不同级别的分离。假如并发交叉执行的事务没有任何控制,操纵相同的共享对象的多个并发事务的执行可能引起异常情况。
DBMS可以在并发执行的事务间提供不同级别的分离。分离的级别和并发事务的吞吐量之间存在反比关系。较多事务的可分离性可能会带来较高的冲突和较多的事务流产。流产的事务要消耗资源,这些资源必须要重新被访问。因此,确保高分离级别的DBMS需要更多的开销。

(4)持久性
持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即一旦一个事务提交,DBMS保证它对数据库中数据的改变应该是永久性的,耐得住任何系统故障。持久性通过数据库备份和恢复来保证。
持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即对已提交事务的更新能恢复。一旦一个事务被提交,DBMS必须保证提供适当的冗余,使其耐得住系统的故障。所以,持久性主要在于DBMS的恢复性能。

㈩ 事务从哪些方面保障数据库的安全

要回答这个问题就必须涉及到一个数据库名词(也可以说是四个):ACID。
Atomicity:原子性
Consistency:一致性
Isolation:隔离性
Durability:持久性
事务的目的也就是维持数据库的这四大特性。
首先,要保证实务操作的原子性,即被定义为原子的一串事务操作必须玩政治性,否则这串操作就要全部回溯(取消)。这点保证了数据的正确性,不会出现数据写了一半挂掉了,这写了一半的数据还存在的情况(想想这对安全是多么大的保障)。
其次一致性,相当于做了个快照,比如你正在读,还没读完,别人更改了这个数据,那么你读出来的应该是更改之前的,也就是你读这个操作的时间点上的数据快照(这里的读是个原子操作)。

然后是隔离性,这个也是很重要的,举个栗子,你有1W存款,你用你的银行卡在提款机提1W,同时你老婆用你的银行卡的副卡在银行里提1W,如果你俩提钱的时间几乎同时,那数据库如何保证不同时给你们俩吐出1W(共两W)呢,这就靠一致性来解决,在其中一个人提钱时会锁住账户(就算是同时也会竞争出一个锁),这样就能保证数据一致行了。大部分人讲这个例子都是以插入举例,我觉得我这个例子挺好的。
最后,持久性,这个不要说了吧,必须要保证数据能够保存在硬盘上。
事务就是要保证以上这四点,保证了这四点,数据库里的数据就正确了。