一篇了解数据库中的控制事务
一,什么是事务
事务,指一组相互依赖的操作行为。只有事务中所有的操作成功,才意味着整个事务成功,只要有一个事务失败,就意味着整个事务失败。在数据库中,事务实际上是一组SQL语句,这些SQL语句通常会涉及到更新数据库中的数据操作。数据库系统会保证只要当事务执行成功时,才会永久保存事务对数据库所做的更新,如果事务执行失败,就会使数据库系统回滚到执行事务前的初始状态。
二,用实例说明
在现实生活中,假如小胡到银行办理转账事务,向把100元转到小李身上,那么必定有以下操作:从小胡身上减去100,小李身上加上100。
很显然,以上两个操作必须作为一个不可分割的整体。如果第一步小胡减去100执行成功,而第二步小李增加100执行失败,那么最终的结果就是整个事务失败。那么进行事务的回滚,就会回到最初始的状态。
而如果执行成功,那么数据库中比如存在执行事务的SQL语句
# 假设数据库中的表名为accounts
update accounts set 小胡.money = 小胡.money - 100 where name = '小胡';
update accounts set 小李.money = 小李.money + 100 where name = '小李';
这两条 sql 语句只要有一条执行失败,那就必须退回到最初的状态。
当然如果这两条 sql 语句都执行成功,那么就表示整个事务成功
三,事务的特征
数据库事务必须具备 ACID 特征。分别表示原子性(Automic),一致性(Consistency),隔离性(Isolation),持久性(Durability)
原子性:指整个事务是不可分割的工作单元。只有事务中所有的操作执行成功,才能算整个事务执行成功;事务中的任何一个SQL语句执行失败,已经执行的SQL语句必须进行撤销,数据库的状态应该回到最原始的状态。
一致性:至数据库中不能破坏关系数据库的完整性以及业务逻辑的一致性。例如上面的银行转账,不过事务的成功与失败,应该保证事务结束后的总金额不变
隔离性:指在并发的环境中,当不同的事务同时操作相同的数据时,每个事务都有自己的完整的空间
持久性:只要数据库完整的结束,name数据库对更新的数据就必须做到永久的保存下来,及时生态系统发生奔溃,重新启动数据库之后,数据库还能恢复到事务成功结束时的状态
四,事务的管理者
事务的ACID特性是由关系数据库系统管理的,并且数据库中采用 日志 来保证事物的原子性,一致性和持久性。日志记录了事务对数据库的更新,如果某个事务在发生过程中出现错误,就可以根据日志,撤销事务对数据库已做的跟新,使数据库回到执行事务前的状态了。这里不得不说一下日志以及查看日志的重要性了。
当然事务的管理系统呢采用了锁的机制来实现事务的隔离性。假如有两个人同时去银行取钱,并取得是同一个用户的钱,那么后来的用户需要等待先来的用户操作完成才能再进行操作,否则假设不进行锁的机制而进行异步操作,那么就有可能操作两个都失败。例如两个人同时取这里面的1000块钱,如果不设置线程同步,那么既有可能两边都出现取出1000元,而用户的余额最终显示为 -1000 元,陷入这是不可能存在的结果。
因此当多个事务同时更新数据库的相同数据时,只允许持有锁的事务更新该数据,其他事物必须等待,直到前一个事务释放了锁,其他事物才有可能更新该数据!
相关文章
- 操作系统4小时速成:复习文件管理,文件控制管FCB,文件逻辑结构,有结构文件,无结构文件,目录结构为了按名存取,多级目录,文件共享和保护,文件分配方式和存储空间管理
- Kubernetes 控制器:从 Kubernetes 资源控制到开放应用模型、工作原理解读
- PostgreSQL 12: 新增 log_statement_sample_rate 参数控制数据库日志中慢SQL百分比
- 蓝牙BLE无线控制氛围灯解决方案之特色解析
- 《SQL入门经典(第5版)》一一6.3 事务控制与数据库性能
- pg_controldata - 显示一个 PostgreSQL 集群的控制信息
- SwiftUI 通过 ARKit 使用微笑控制 SwiftUI 视图(教程含源码)
- SwiftUI 动画大全之逐帧动画编程控制播放(教程含源码)
- 【Java基础教程】详解Java三种流程控制语句
- 【快应用】如何通过计算属性控制组件样式
- 【正点原子FPGA连载】第九章按键控制LED灯实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1
- 想控制GIF图片动画播放吗?试试gifffer.js
- 《手把手教你学C语言》学习笔记(10)--- 程序的循环控制
- setState()批处理,合并策略,控制批处理----batchUpdates