2年过后,实践+工作。层多次遇到和听到事务的概念。不经想起了,当初看的那本sql入门经典。再次翻看。收货巨多!今天来聊聊数据库的事务吧。
所谓不谋全局者不足谋一域,不谋万世者不足某一时。让咱先上一张导图吧。
好吧,是有点看不清的感觉。
下面是思维导图的简易版。
一:背景
- 解决数据更新带来的冲突问题。
事务四个特性
持久性
结束时,必须正确保存数据,不管出现什么特殊、意外情况 断电、设备失效…… 不能只保存部分、不完整的数据 durable
* 隔离性*
正在改变、改变被提交或被应用前的数据,应得到隔离: 即:其他用户不可见 事务完成,数据还在,那其他用户必须对其可见。 解开隔离 isolated
一致性
不覆盖之前的更新 数据库处于确定的一致的状态 consistent
原子性
要么全部完成,要么全部失败 atomic
3什么时候不用?
在新创建的表中的,且利用新的记录初始化改表的操作不需要事务
4什么时候用?
数据库可能出现不确定状态
更新丢失
未确认
前后读取数据不一致
二: 事务模型
1、 ANSI——sql
2、Transact——sql
三:思想
1、使用关键字:
ANSI—— sql
commit
rollback
注意:使用了隐藏的commit,默认在第一个sql语句前加上的。 目的,结束上一个事务操作,是数据库处于一致状态
Transact——sql
begin transaction
savetransaction
committransaction
2、将多条sql语句,封装为一个事务
使其成为一个独立的执行单元要么全部完成,要么全部撤销
作用: 阻止、允许其他用户看到 您在特殊环境所做的数据改变
四、 常见问题(并发)处理
- 更新丢失
- 未确认
- 前后数据读取不一致:不一致数据 && 幻影插入
五、 实现
**1、使用事务日志**
原理
记录操作前
记录操作后
存储
和主数据库位于不同物理驱动器
问题:
性能问题
资源开销
内存
磁盘
好处
回滚事务操作
注意:每种dbms的实现各自不同
**2、使用锁**
工作方式(原理)
粒度
库
表
页
行
列
级别
共享
专有
死锁
降低锁的影响
参数化
粒度
数目
级别
超时
注意:一般的dbms,有自己的锁机制。通常不需要用户来干涉
带来的问题
死锁
处理方法
版本控制(Oracle)
周期性检测死锁,并随机抽取事务,进行回滚
原因
性能
原因
处理方法
限制了数据的并发操作
作用:确保一致性
本质:限制用户的操作
**3、使用隔离级别(某些dbms支持,并不是全部)**
概念
数据库用户
用户的事务之间
事务之间被允许的相互干涉程度
四个级别
serializable
all
repeatable read
无法解决幻影插入
read committed
前后数据读取不一致无法解决
read uncommitted
仅确保解决更新丢失
六:小结
实在是很恶心,关于csdn的markdone编辑器。巨难用!操作起来两边效果不能得到自己想要的东西。好吧。是时候,转移到github上去玩了。