数据库
A:数据库是什么?
B:数据库当然是指用来存储数据的仓库呀,但实际上一般是指DBMS
A:DBMS?
B:对,DBMS是用来管理数据的,包括数据的新增、删除、修改和查询。常见的DBMS如Oracle和MySQL
B:我现在的工作中就要用到Oracle,但一般都说我们用的数据库是Oracle,严谨的说法应该是我们用的数据库管理系统是Oracle
A:你能解释得简单点,详细点吗?
B:好的,我试试
B:比如说Oracle,它实际上就是一个软件,就像微信,微信可以用来聊天,Oracle可以用来管理数据,这里的数据主要是指结构化数据
A:结构化数据?
B:如何说你使用微信的时候要你登录,登录一般要用到用户名和密码对吧
A:嗯嗯,现在都是用手机号一键登录了
B:本质上是一样的,只要能够唯一的识别
B:这里简单的
事务
事务(Transcation)是指数据库系统的一组操作序列,该组操作序列要么全部执行,要么全部不执行
-- 一个完整的事务
begin; //开始事务
insert into test_user values(1, '大土', 26); //具体操作
update test_user age = 20; //具体操作
commit; //结束事务
根据事务的定义, ISO/IEC 提出事务一般具备ACID特性
数据库系统为什么需要事务?
因为业务中存在需求,最常举的例子就是银行转账业务,转账人的扣款操作和收款人的入款操作必须一致,要么都成功,要么都失败
ACID
ACID是 Atomicity(原子性) Consistency(一致性) Isolation(隔离性) Durability(持久性)的缩写
- A :属于同一事务的操作要么全部都执行,要么全部都不执行
- C :事务执行之后,数据要么与之前保持一致,要么与事务预期一致,不存在其他状态
- I :各个事务之间相互独立执行,一个事务的开始和结束不受其他事务影响
- D :事务执行之后,数据的状态会一直保持到被其他事务改变
事务的隔离特性会产生这样一个问题:多个事务操作同一数据时,各个事务在各自不同操作阶段可能相互交叉执行,而不同的交叉组合会产生不同的数据结果,因此SQL标准定义了四种级别来阐述这些组合所产生的不同数据结果
四种隔离级别
- READ UNCOMMITTED:一个事务可以读取另一个事务未提交的数据(可能产生 脏读现象 、 不可重复读现象 、幻读现象 )
- READ COMMITTED:一个事务只能读取另一个事务已经提交的数据,但不保证多次读取的结果保持一致(可能产生 不可重复读现象 、幻读现象 )
- REPEATABLE READ:一个事务只能读取另一个事务已经提交的数据,但保证多次读取的结果保持一致(可能产生 幻读现象 )
- SERIALIZABLE:多个事务以串行顺序执行
数据库操作系统底层实现隔离性是通过锁和MVCC
锁
MVCC
MVCC是 Multi-Version Concurrency Contorl的缩写,译为多版本并发控制,是指在并发访问数据库系统时,对正在事务内处理的数据做多版本的管理,以此来避免由于写操作的堵塞而引发读操作失败的并发问题。简单来说,MVCC就是一个数据临时保留多个版本,从而实现并发控制
例如:在REPEATABLE READ的隔离级别中,一个事务重复读取到相同的数据,该数据是其他事务未修改之前的数据,这里就利用了MVCC,读到的数据来源于快照