一、经典案例 1.抖音红包雨 从抖音的账户上扣除一个小目标 给羊老师的账户加上一个小目标
UPDATE account_table SET balance = balance - '小目标’WHERE name =‘抖音’; UPDATE account_table SET balance = balance +'小目标’WHERE name =‘羊老师’; 2.事务ACID
事务(Transaction): 是由一组SQL语句组成的一个程序执行单元(Unit),它需要满足ACID特性 BEGIN; UPDATE account table SET balance = balance - '小目标 WHERE name =“抖音'; UPDATE account_table SET balance = balance +'小目标' WHERE name =杨洋'; COMMIT; ACID 原子性(Atomicity): 事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。 一致性(Consistengy): 数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。 隔离性(solation): 多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。 持久性(Durability): 在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
3、红包雨与ACID
原子性:当抖音已经已经扣除一个亿,假设服务器挂了,那么就抖音亏一个亿,羊老师也没加上,所以必须保证同时成功或同时失败,不存在中间状态。 一致性:假设抖音只剩0.5亿,但又扣除一个亿,那么就为负了。这样是不合法的,所以必须要保证每个操作都是合法的,从一个有效的状态变到另一个有效状态。 隔离性:如果羊老师从抖音和头条同时强了1个亿,那么他们同时给老师转1个亿,结果老师却只加了1个亿,因为两个操作互相影响了。两个操作在同个账户并发进行,应该是互不影响的,表现是串行操作。 持久性:如果你已经成功拿到抖音一个亿了,抖音也扣了一个亿。但是服务器挂机了,没持久化数据,那么最后还是没有拿到。所以必须保证在操作成功之后,更新的结果被永久保留下来,不会因为宕机而丢失。 高并发:全国14亿人抢红包,如果1秒只执行1个请求,那么要31年才能完成。所以必须得支持高并发,每秒执行1000w请求,只需要1分多钟 高可靠:假设除夕晚上大家正在愉快的从抖音身上“羊毛”,这时候服务器挂了,程序员花了一个小时,头发都掉光了,终于修好了。"抖音宕机"秒上热搜,所以,必须保证高可靠。 二、发展历史
1、前DBMS时代-人工管理 在现代计算机发明出来以前,通过人工的方式进行数据记录和管理,如结绳记事,钱庄账本,用于人工普查的打孔机,这些都需要人工操作。 2、前DBMS时代-文件系统
1950s,现代计算机的雏形基本出现。1956年IBM发布了第一个的磁盘驱动器--Model 305 RAMAC,从此数据存储进入磁盘时代。在这个阶段,数据管理直接通过文件系统来实现。 从写到纸上变成写到文件里,变了个马甲 3、DBMS时代 1960s,传统的文件系统已经不能满足人们的需要,数据库管理系统(DBMS)应运而生. DBMS:按照某种数据模型来组织、存储和管理数据的仓库.所以通常按照数据模型的特点将传统数据库系统分成网状数据库、层次数据库和关系数据库三类.
网状数据库所基于的网状数据模型建立的数据之间的联系,能反映现实世界中信息的关联,是许多空间对象的自然表达形式。优点:能直接描述现实世界,存取效率较高。缺点:结构复杂,用户不易使用 ,访问程序设计复杂。 层次数据模型,即使用树形结构来描述实体及其之间关系的数据模型。优点:结构简单,查询效率高,可以提供较好的完整性支持。缺点:无法表示M:N的关系 ,插入、删除限制多,遍历子节点必须经过父节点,访问程序设计复杂。 关系数据模型:优点:实体及实体间的的联系都通过二维表结构表示,可以方便的表示M:N关系,数据访问路径对用户透明。缺点:关联查询效率不够高,关系必须规范化。