数据库的安全与保护(下)

三、事务

1、基本概念

事务(transaction)定义:

形成一个逻辑工作单位的数据库操作汇集(集合)。

例如:在关系数据库中,一个事务可以是一条SQL语句、一组SQL 语句或整个程序。

说明:

➢ 是数据库环境中的逻辑工作单位;

➢ 类似于操作系统环境中的"进程"概念;

➢ 一个事务由应用程序中一组操作序列组成,以BEGIN TRANSACTION语句开始,以COMMIT(提交)或ROLLBACK(回滚) 结束。

➢事务和程序是两个概念。一般地讲,一个程序中包含多个 事务。

2、事务的ACID性质

a. 原子性(Atomicity)

一个事务中所有对数据库的操作,是一个不可分割的操作序列。

b. 一致性(Consistency)

一个事务独立执行的结果,将保持数据库的一致性,即数据不 会因事务的执行而遭受破坏。

c. 隔离性(Isolation)

多个事务并发执行时,系统应保证与这些事务先后单独执行时 的结果一样。

d. 持久性(Durability)

一个事务一旦完成全部操作,它对数据库的所有更新应永久性 地反映在数据库中。

2、事务的ACID性质

数据库的访问:

I. read(X):把数据X从数据库中读到内存缓冲区

II. write(X):把数据X从内存缓冲区写回数据库

举例:银行数据库中有一转帐事务Ti,从帐号A转一笔款(¥50) 到帐号B。

其操作如下:

原子性: 事务中所有操作应作为一个整体,不能分割,要么全做,要么全 不做。 如果只修改了A的值而没有修改B的值,就违反了事务的原子性。

一致性: 在事务Ti执行结束后,要求数据库中A的值减50,B的值增50, 即A与B的和不变,此时称数据库处于一致状态。

隔离性: 同时两个事务Ti和Tj对A、B操作,彼此独立,互不干涉。

持久性: 事务的持久性保证事务成功执行后,所有对数据库修改的影响 应长期存在,不能丢失。既使计算机系统的故障导致内存中数 据丢失,但写入磁盘的数据也决不能丢失。

3、事务的写法

Begin transaction

read A

A:=A-s

If A<0 then display "insufficient fund"

Rollback

Else B:=B+s

Display"transfer complete"

Commit

4、事务的状态变迁

在事务开始执行后,立即进入"活动"状态。 在活动状态,事务执行对数据库的读/写操 作。但是"写操作"并不立即写到磁盘上, 很可能暂时存放在系统缓冲区中。

事务的最后一个语句执行之后, 进入"局部提交"状态。事务 执行完毕,但对数据库的修改, 可能还在内存的系统缓冲区中, 事务还没有真正结束。

处于活动状态的事务还没 有执行完最后一个语句就 中止执行,事务进入"失 败"状态。

在局部提交状态,虽然事务的 语句执行结束,但对数据库的 修改可能还没有写到数据库。 此时,如果系统出现故障,事 务将进入"失败"状态。

处于失败状态的事务,可能已 对磁盘中的数据进行了部分修 改。为了保证事务的原子性, 应该撤销该事务对数据库已做 的修改。称为事务的回退。

事务进入异常中止状态,系统可 以重新启动(软硬件故障),或 取消事务(事务逻辑错误)。

事务进入局部提交状态后,并发控制系统 将检查并发事务之间是否存在干扰现象, 通过检查后,系统执行提交操作,把对数 据库的修改全部写到磁盘上。事务成功结 束,进入"提交"状态。

5、事务的并发执行

事务的语句分为两类:

➢ I/O活动 顺序执行

➢ CPU活动 并发执行

定义:事务的执行次序称为"调度"。

多个事务依次执行-》串行调度

利用分时方法同时处理多个事务-》并发调度

例:事务T1从帐号A转¥100到帐号B,事务T2从帐号A转 10%到帐号B。

初始:A=2000 B=1000 串行调度1: 先执行T1,后执行T2 结束:A=1710 B=1290

初始:A=2000 B=1000 串行调度2: 先执行T2,后执行T1 结束:A=1700 B=1300

初始:A=2000 B=1000 并发调度1 结束:A=1710 B=1290  正确的并发调度

初始:A=2000 B=1000 并发调度2 结束:A=1900 B=1300  错误的并发调度

6、并发事务的可串行化

并发调度中,有的可以保持数据 库的一致性,有的不能。

冲突可串行化

设有事务Ti和Tj,其调度为S,S中有两个相邻的语 句Ii和Ij,分别来自Ti和Tj,并对同一数据Q操作。存 在以下可能:

➢Ii=read(Q),Ij=read(Q);

➢ Ii=read(Q),Ij=write(Q);

➢ Ii=write(Q),Ij=read(Q);

➢ Ii=write(Q),Ij=write(Q);

定义 Ii和Ij分别是并发事务Ti和Tj中的read或write 语句,并在并发调度中相邻。当Ii和Ij是对同一数据操 作时,并且至少有一个是write语句,我们称Ii和Ij是 一对"冲突"的语句,否则称为"非冲突"语句。

在调度S中,有一对相邻的语句是"非冲突"的语句,那么它们的先后 次序可以交换,交换后产生的新调度S'与S等价,即产生相同的执行结果。

定义 如果调度S'是从调度S通过交换一系列的非冲突语句得到,那么 称S'和S是一对"冲突等价"的调度。 如果调度S与某个串行调度是"冲突等价",那么称S是"冲突可串 行化"的调度。

7、SQL中的事务定义

SQL没有专门的事务开始语句,每一个对数据库或关系的查 询与操作都包含着一个事务的开始。事务的结束语句是COMMIT或 ROLLBACK。

➢ COMMIT:提交当前事务,并开始一个新的事务;

➢ ROLLBACK:中止当前事务,执行回退操作,开始新事务。

事务的读写类型

➢ READ ONLY 只读型

➢ READ WRITE 读写型

SQL定义:

SET TRANSACTION READ ONLY

SET TRANSACTION READ WRITE

事务的一致性级别

➢ SERIALIZABLE 可串行化

➢ REPEATABLE READ 可重复读写

➢ READ COMMITTED 读提交数据

➢ READ UNCOMMITTED 可以读未提交数据

SQL定义:

SET TRANSACTION ISOLATION SERIALIZABLE

SET TRANSACTION ISOLATION REPEATABLE READ

SET TRANSACTION ISOLATION READ COMMITTED

SET TRANSACTION ISOLATION READ UNCOMMITTED

相关推荐
期待のcode2 小时前
MyBatisX插件
java·数据库·后端·mybatis·springboot
安审若无4 小时前
oracel迁移数据文件至其他目录操作步骤
数据库
醇氧4 小时前
【Windows】优雅启动:解析一个 Java 服务的后台启动脚本
java·开发语言·windows
sunxunyong5 小时前
doris运维命令
java·运维·数据库
菜鸟起航ing5 小时前
Spring AI 全方位指南:从基础入门到高级实战
java·人工智能·spring
古城小栈5 小时前
Docker 多阶段构建:Go_Java 镜像瘦身运动
java·docker·golang
小鸡吃米…5 小时前
Python PyQt6教程七-控件
数据库·python
MapGIS技术支持5 小时前
MapGIS Objects Java计算一个三维点到平面的距离
java·开发语言·平面·制图·mapgis
Coder_Boy_5 小时前
业务导向型技术日志首日记录(业务中使用的技术栈)
java·驱动开发·微服务
忍冬行者5 小时前
清理三主三从redis集群的过期key和键值超过10M的key
数据库·redis·缓存