关系型数据库保证数据的完整性和一致性是最佳的。
完整性
- 实体完整性:每个实体独一无二(主键/唯一索引)
- 参照完整性 (引用完整性): 子表中不能有父表中没有的数据(外键)
- 域完整性:数据都是有效数据(数据类型和长度,非空约束,默认值约束,检查约束)
-- 检查学生年龄是否为1到200的数字
stuage in check (stuage between 1 and 200)
alter table tb_student add constraint;
一致性
数据的一致性用事务来实现。
事务:一系列对数据不可分割的操作(要么全做,要么全不做)
事务ACID特性:
atomicity 原子性 | 不可分割 |
consistency 一致性 | 前后数据状态保持一致 |
isolation 隔离性 | 多个并发事务不知道彼此的中间状态 |
duration 持久性 | 事务完成后,对数据的修改要持久化 |
并发事务访问数据可能产生的五大类问题:
- 第一类丢失更新
- 第二类丢失更新
- 脏读(读脏数据)
- 不可重复读
- 幻读
解决:
-
单版本并发控制-加锁-悲观锁-性能太差
-
多版本并发控制(MVCC)- 乐观锁 - 不会经常遇到数据冲突 一条数据多个版本 -性能更好-需要冗余字段支持
直接操作锁非常麻烦,设置事务隔离级别,数据库自动加合适的锁
事务隔离级别:
- 读未提交
- 读提交 --避免读到脏数据 oracle默认
- 可重复读–避免幻读 mysql默认
- 串行化–最高事务隔离级别,性能最差,无并发 ,悲观锁。
更多内容:参考这篇