三大特性可谓是:实体、属性和关系。
实体:表; 属性:表中的数据(字段); 关系:表与表之间的关系;
从数据库用户的观点来看,数据库中一些操作的集合被认为是一个独立单元。
构成单一逻辑工作单元的操作集合称为事务。事务是访问并可能更新各种数据项的一个程序执行单元。
原子性(Atomicity):事务是一个不可分割的工作单元,事务中的操作要么发生,要么不发生。
一致性(Consistency):在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
隔离性(Isolation):多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。
持久性(Durability):一个是=事务成功完成后,该事务对数据库所作的更改是永久性的,即使出现系统故障
第一范式:数据表中的每一列(每个字段)必须是不可拆分的最小单元,也就是确保每一列的原子性;
第二范式(2NF):满足1NF后,要求表中的所有列,都必须依赖于主键,而不能有任何一列与主键没有关系,也就是说一个表只描述一件事情;
第三范式:必须先满足第二范式(2NF),且要求:表中的每一列只与主键直接相关而不是间接相关(表中的每一列只能依赖于主键);
• primary KEY:设置主键约束;(主键默认非空,默认唯一性约束,只有主键才能设置自动增长,自动增长一定是主键,主键不一定自动增长)
• UNIQUE:设置唯一性约束,不能有重复值;
• DEFAULT 默认值约束,height DOUBLE(3,2)DEFAULT 1.2 height不输入是默认为1,2
• NOT NULL:设置非空约束,该字段不能为空;
• FOREIGN key :设置外键约束。
参照表的完整性操作:当对参照表的参照字段进行删除或更新时,外键表中的外键如何应对参照操作可选值:
RESTRICT拒绝参照表删除或更新参照字段; RESTRICT和NO ACTION相同,但这个指令只在mysql生效; CASCADE删除或更新参照表的参照字段时,外键表的记录同步删除更新; SET NULL 删除或更新参照表的参照字段时,外键表的外键设为NULL;
在介绍数据库提供的各种隔离级别之前,我们先看看如果不考虑事务的隔离性,会发生的几种问题:
更新丢失:两事务同时更新,一个失败回滚覆盖另一个事务的更新。或事务1执行更细操作,在事务1结束前事务2也更新,则事务1的更细结果被事务2的覆盖了。
脏读:事务T2读取到事务T1修改了但是还未提交的数据,之后事务T1又回滚其更新操作,导致事务T2读到的是脏数据。
不可重复读:事务T1读取某个数据后,事务T2对其做了修改,当事务T1再次读该数据时得到与前一次不同的值。
虚读(幻读):事务T1读取在读取某范围数据时,事务T2又插入一条数据,当事务T1再次数据这个范围数据时发现不一样了,出现了一些“幻影行”。
脏读和不可重复读的区别:脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
不可重复读和幻读的异同:都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。
含义解释:只限制同一数据写事务禁止其他写事务。解决”更新丢失”。(一事务写时禁止其他事务写)
名称解释:可读取未提交数据
所需的锁:排他写锁
含义解释:只限制同一数据写事务禁止其它读写事务。解决”脏读”,以及”更新丢失”。(一事务写时禁止其他事务读写)
名称解释:必须提交以后的数据才能被读取
所需的锁:排他写锁、瞬间共享读锁
含义解释:限制同一数据写事务禁止其他读写事务,读事务禁止其它写事务(允许读)。解决”不可重复读”,以及”更新丢失”和”脏读”。(一事务写时禁止其他事务读写、一事务读时禁止其他事务写)
注意没有解决幻读,解决幻读的方法是增加范围锁(range lock)或者表锁。
名称解释:能够重复读取
所需的锁:排他写锁、共享读锁
含义解释:限制所有读写事务都必须串行化实行。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。(一事务写时禁止其他事务读写、一事务读时禁止其他事务读写)
所须的锁:范围锁或表锁
后记:隔离级别的设置只对当前链接有效。对于使用MySQL命令窗口而言,一个窗口就相当于一个链接,当前窗口设置的隔离级别只对当前窗口中的事务有效;对于JDBC操作数据库来说,一个Connection对象相当于一个链接,而对于Connection对象设置的隔离级别只对该Connection对象有效,与其他链接Connection对象无关。