==数据库事务(简称:事务)==是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。
ACID
事务的原子性(atomic) 是指一个事务要么全部执行,要么不执行.也就是说一个事务不可能只执行了一半就停止了
事务的一致性(consistency) 是指事务的运行并不改变数据库中数据的一致性.
数据库的状态满足所有的完整性约束,就说该数据库是一致的。
例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变.
事务的隔离性(isolation) 是指并发的事务是相互隔离的。
两个以上的事务不会出现交错执行的状态.因为这样可能会导致数据不一致.
事务的持久性(durability)是指事务运行成功以后,就系统的更新是永久的.
数据库四个隔离级别
1、Serializable (串行化):最严格的级别,在读的每一行数据上都加上锁。事务串行执行,资源消耗最大;
2、REPEATABLE READ (重复读) :保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但不能避免“幻读”,但是带来了更多的性能损失。
3、READ COMMITTED (提交读) :大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”,但不能避免“幻读”和“不可重复读取”。该级别适用于大多数系统。
4、Read Uncommitted (未提交读) :事务中的修改,即使没有提交,其他事务也可以看得到,会导致“脏读”、“幻读”和“不可重复读取”。
三个范式
首先要明确的是:满足着第三范式,那么就一定满足第二范式、满足着第二范式就一定满足第一范式
第一范式:字段是最小的的单元不可再分
学生信息组成学生信息表,有年龄、性别、学号等信息组成。这些字段都不可再分,所以它是满足第一范式的
第二范式:满足第一范式,表中的字段必须完全依赖于全部主键而非部分主键。
其他字段组成的这行记录和主键表示的是同一个东西,而主键是唯一的,它们只需要依赖于主键,也就成了唯一的
学号为1024的同学,姓名为Java3y,年龄是22岁。姓名和年龄字段都依赖着学号主键。
第三范式:满足第二范式,非主键外的所有字段必须互不依赖
就是数据只在一个地方存储,不重复出现在多张表中,可以认为就是消除传递依赖
比如,我们大学分了很多系(中文系、英语系、计算机系……),这个系别管理表信息有以下字段组成:系编号,系主任,系简介,系架构。那我们能不能在学生信息表添加系编号,系主任,系简介,系架构字段呢?不行的,因为这样就冗余了,非主键外的字段形成了依赖关系(依赖到学生信息表了)!正确的做法是:学生表就只能增加一个系编号字段。
DML(data manipulation language):
它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言
DDL(data definition language):
DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用
DCL(Data Control Language):
是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL
视图
视图是一种基于数据表的一种虚表
(1)视图是一种虚表
(2)视图建立在已有表的基础上, 视图赖以建立的这些表称为基表
(3)向视图提供数据内容的语句为 SELECT 语句 ,可以将视图理解为存储起来的 SELECT 语句
(4)视图向用户提供基表数据的另一种表现形式
(5)视图没有存储真正的数据 ,真正的数据还是存储在基表中
(6)程序员虽然操作的是视图,但最终视图还会转成操作基表
(7)=一个基表可以有0个或多个视图
视图可以将查询出来的数据进行封装
数据库索引
Redis
Java Web开发中,用数据库来进行数据的存储,涉及大数据量的需求(如商品抢购),或系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问题。
克服以上问题Java Web采用NoSQL技术,基于内存的数据库。
Redis是NoSQL中的一种,性能优越,支持每秒十几万次读/写操作,性能远超数据库,还支持**集群、分布式、主从同步等配置,原则上可以无限扩展,让更多的 数据存储在内存 中,更让人欣慰的是它还支持一定的 事务能力,这保证了高并发的场景下数据的 安全和一致性。
‘
应用场景
存储 缓存 用的数据;
需要高速读/写的场合使用它快速读/写;
日常中对数据的读操作>写操作
一般我们只是使用 Redis 存储一些常用和主要的数据,比如用户登录的信息等。
Redis作为缓存的读逻辑
从上图我们可以知道以下两点:
当第一次读取数据的时候,读取 Redis 的数据就会失败,此时就会触发程序读取数据库,把数据读取出来,并且写入 Redis 中;
当第二次以及以后需要读取数据时,就会直接读取 Redis,读到数据后就结束了流程,这样速度就大大提高了。
写操作流程
所以读操作大于写操作时用Redis