第八章
*事务的四个特性(ACID)
*原子性(A)
--事务是最小的工作单元,不可再分
*一致性(C)
--事务要求所有的DML语句操作的时候,必须保证同时成功或同时失败
*隔离性(I)
--事务A和事务B之间具有隔离性
*持久性(D)
--是事务的保证,事务终结的标志
*事务的一些术语
*开启事务 Start Transaction
*事务结束 End Transaction
*提交事务 Commit Transaction
*回滚事务 Rollback Transaction
*SQL语句:
*commit
--提交,成功的结束,事务的结束
*rollback
--回滚,失败的结束,事务的结束
*事务的开启标志和结束标志
*开启标志:
--任何一条DML语句执行,标志着事务的开启
*在MYSQL数据库管理系统中,事务的提交和回滚的演示
--在MYSQL数据管理系统中,默认情况下,事务时自动提交的,关闭自动提交方式如下:
--start transaction
--set autocommit=off
--set session autocommit = off
以上关闭机制只对当前对话有效
--打开自动提交
--set autocommit=off
--set session autocommit = off
*事务的隔离性
*事务A和事务B之间有一定的隔离性
*隔离性有四个级别:
--read uncommitted 读未提交(最低级别)
--事务A和事务B,事务B可以读到事务A未提交的数据
--这种读到的数据可以叫"脏数据",或者"Dirty read"
--read committed 读已提交
--事务A提交的数据,事务B才可以读到
--这种隔离级别可以避免脏数据
--这种隔离级别会导致不可重复读取
--Oracle数据库默认的隔离机制
--repeatable read 可重复读
--事务A提交之后的数据,事务B读取不到
--事务B可以重复读取数据
--这种隔离级别可以不可重复读取,达到可重复读取
--这个隔离级别高于读已提交
--MySQL数据库系统默认的隔离机制
--这种隔离级别会导致"幻象读"
--serializable 串行化
--事务A和事务B,事务A在操作数据库表中数据的时候,事务B只能排队
--事务A和事务B是串行执行,不在并发
--一般很少使用,吞吐量太低,用户体验不好
--这种隔离级别可以避免"幻象读",每一次读取都是数据库真实的数据
*设置事务的隔离级别
--修改配置文件设置,修改my.ini
[mysqld]
transaction-isolation=...
--READ-UNCOMMITTED
--READ-COMMITTED
--REPEATABLE-READ-COMMITTED
--SERIALIZABLE
--使用命令行设置
set [无/session/global] transaction isolation level <isolation-level>...;
--READ-UNCOMMITTED
--READ-COMMITTED
--REPEATABLE-READ-COMMITTED
--SERIALIZABLE
*设置事务的隔离级别作用于全局
set global transaction isolation level <isolation-level>...;
*设置事务的隔离级别作用于当前会话
set [无/session] transaction isolation level <isolation-level>...;
*查看隔离级别
--查看当前会话的隔离级别
select @@tx_isolation;
select @@session.tx_isolation;
--查看全局的隔离级别
select @@global.tx_isolation;
数据库设计的三范式
--数据库设计第一范式
*要求有主键,并且每一个字段原子性不可再分
--数据库设计第二范式
*要求所有非主键字段完全依赖主键,不能产生部分依赖
*尽量不使用联合主键
--数据库设计第三范式
*要求非主键字段和主键字段不能产生传递依赖
--比较经典的设计
*一对一
--两张表存储,外键唯一(fk-unique)
--两张表存储,共享主键
*一对多
--分两张表存储,在多方的一方添加外键引用一方的主键字段
*多对多
--三张表,两张表分别存储两方的相关信息,第三张表存储两方的关系
--数据库开发实际设计
*数据库设计尽量遵循三范式
*有时也根据实际情况进行取舍