数据库事务总结

食事务基本概念

事务是构成单一逻辑工作单元的操作集合,要么完整的执行,要么完全不执行。在程序中,事务以 BEGIN TRANSTATION语句开始,以COMMIT语句或ROLLBACK语句结束。

事务的ACID性质:

  • A:原子性    一个事务是一个不可分割的逻辑单元
  • C:一致性    数据不会因事物的执行而遭到破坏
  • I:隔离性     多个事务并发执行,保证结果正确
  • D:持久性    事务执行后,他对数据库的更新要永久反映到数据库中

事务的状态变迁图:

活动状态:在事务开始执行后,立即进入“活动状态”。在活动状态事务将执行对数据库的读写操作。

局部提交状态:事务最后一个语句执行完成后,进入局部提交状态。事务执行完了,但对事务的修改很可能还留在内存的系统缓存区中,所以还不能说事务真正结束。

失败状态:处于活动状态的事务还没到达最后一个语句就终止执行,此时就称事务进入失败状态。或者处于局部提交状态的事务遇到故障(如发生干扰,或未能完成对数据库的修改),也进入失败状态。

异常终止状态:处于失败状态的事务,很可能已经对磁盘中的数据进行了一部分的修改。为保证事务的原子性,应该撤销该事务已经对数据库的修改。

提交状态:食物进入局部提交状态后,并发控制系统将检查该事务与并发事务是否发生干扰现象。检查通过后,系统提交操作,将修改内容写到磁盘上。事务成功结束。

数据库恢复:

数据库恢复的具体实现方法如下:

平时做好两件事:转储和建立日志。

  1. 周期地对整个数据库进行复制,转储到另一个磁盘等存储介质中。
  2. 建立日志数据库。记录日志的开始、结束标志,记录事务对数据库的每一次插入、删除和修改后的值,写到日志库中,以便有案可查。

一旦发生故障,分两种情况处理:

  1. 如果数据库遇到灾难性故障,比如磁盘损坏等,这是数据库已经不能再用了,应该装入最近备份的数据库,并利用日志重做已提交的事务。
  2. 如果只是破坏了数据库的一致性,只要利用日志库撤销所有不可靠的修改,再利用日志重做相关日志即可。

故障类型和恢复方法:

1、事务故障

事务故障可分为两种:可预期故障和非预期故障。

  • 可预期故障:即在程序中可以预先估计到的错误。例如:存款余额透支等。这种情况可以在事务代码中添加判断和回滚语句。
  • 非预期故障:例如:运算溢出、数据错误,发生死锁等。这种情况系统直接对事务进行UNDO(撤销)处理。

2、系统故障

引起系统停止运转随之要求重新启动的事件称为系统故障。例如硬件故障、软件错误或掉电等几种情况。系统故障会影响正在运行的所有事务,但不破坏数据库。恢复办法是重新启动,重新启动时需要对非正常终止的事务进行处理,把数据库恢复到正确的状态。

重新启动时,具体处理分两种情况:

  • 对未完成的事务做UNDO(撤销)处理
  • 对已提交事务但更新还停留在缓冲区的事务进行REDO(重做)处理

3、介质故障

在发生介质故障或遭到病毒破坏时,磁盘上的数据库遭到毁灭性的破坏。此时恢复过程如下:

  1. 重装最近转储的后备副本到新的磁盘,使数据库恢复到转储时的一致状态。
  2. 在日志中找出最近转储以后所有提交的事务。
  3. 对这些事务进行REDO处理,将数据库恢复到故障前一刻的一致性状态。

实际中,系统故障称为软故障,介质故障称为硬故障。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

Redis 集群教程

本文档是Redis集群的入门教程, 从用户的角度介绍了设置、测试和操作集群的方法。 本教程不包含晦涩难懂的分布式概念, 也没有像Redis 集群规范那样包含Re...

2977
来自专栏Web项目聚集地

MyBatis-逆向工程「Generator使用指南」

当你利用搜索引擎搜索Maven会出来很多名词:对象模型、标准集合、依赖管理系统这是啥啊?差不多得你会用了Maven才会理解这些名称吧,我找到了一个博主的博客

1422
来自专栏L宝宝聊IT

Linux基础——RAID和LVM

3114
来自专栏difcareer的技术笔记

反调试检测之一TracerPid

当我们使用Ptrace方式跟踪一个进程时,目标进程会记录自己被谁跟踪,可以查看/proc/pid/status看到这个信息,下图展示的是使用ida进行调试的情况...

1213
来自专栏云计算教程系列

如何在CentOS 7上使用Linux审计系统

在Linux审核系统可以帮助系统管理员创建一个审计跟踪,日志服务器上的每一个动作。我们可以通过检查审计日志文件来跟踪与安全相关的事件,将事件记录在日志文件中,以...

9015
来自专栏云计算教程系列

如何更改SELinux模式

Security Enhanced Linux是一个Linux安全模块,用于强制或基于角色的访问控制。SELinux默认与CentOS和Fedora打包在一起,...

2402
来自专栏枕边书

Linux - 请允许我静静地后台运行

前言 常在 linux 下玩耍的开发者肯定会经常遇到需要对进程调度的情况,在 windows 中点击 最小化 去干别的就 OK 了,那么在 linux 下怎么办...

2385
来自专栏懒人开发

bpkg工具

最近接手一个项目 本来是jenkinsfile相关, 但是由于这里很多实现都是用的shell 并且还是用的 bpkg 做的管理, 再在bpkg基础上, 写了...

1753
来自专栏Ryan Miao

maven中使用junit老是找不到包

如题,烦恼好久,突然看到scope一直是test,改成compile就好了。 compile (编译范围) compile是默认的范围;如果没有提供一个范围...

5949
来自专栏北京马哥教育

Linux内核编译过程详解

前言 Linux内核是Linux操作系统的核心,也是整个Linux功能体现的核心,就如同发动机 在汽车中的重要性。内核主要功能包括进程管理、内存管理、文件管...

72810

扫码关注云+社区

领取腾讯云代金券