JAVA----sql(三范式、事务安全、事务的四大特性)
一.表的设计
1.外键约束
一张表中的某个字段引用另一个表的主键
主表: 约束别人
副表/从表: 使用别人的数据,被别人约束
2. 三范式
设计数据库表的规则,好的数据库设计对数据的存储性能和后期的程序开发,都会产生重要的影响。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。
2.1.第一范式:
表中每个列的值只能是表的一个属性或一个属性的一部分。
每一列不可再拆分,称为原子性
。
2.2.第二范式:
一张表只描述一件事情
表中的每一个字段都依赖于主键
总结:如果不准守第二范式,数据冗余,相同数据无法区分。遵守第二范式减少数据冗余,通过主键区分相同数据。
2.3.第三范式:
从表的外键必须使用主表的主键
总结:如果不准守第三范式,可能会有相同数据无法区分,修改数据的时候多张表都需要修改(不方便修改)。遵守第三范式通过id可以区分相同数据,修改数据的时候只需要修改一张表(方便修改)。
二. 事务安全
在实际的业务开发中,有些业务操作要多次访问数据库。一个业务要发送多条SQL语句给数据库执行。需要将多次访问数据库的操作视为一个整体来执行,要么所有的SQL语句全部执行成功。如果其中有一条SQL语句失败,就进行事务的回滚,所有的SQL语句全部执行失败。
MySQL默认开始自动提交事务,意思是在MySQL的每一条DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,执行完毕自动提交事务。
1.控制事物
1.显示开启一个事务(手动开启事务)
start transaction;开启事务
commit;提交事务
rollback;回滚事务
手动提交事务使用步骤:
第1种情况:开启事务 -> 执行SQL语句 -> 成功 -> 提交事务
第2种情况:开启事务 -> 执行SQL语句 -> 失败 -> 回滚事务
总结: 如果事务中SQL语句没有问题,commit提交事务,会对数据库数据的数据进行改变。 如果事务中SQL
语句有问题,rollback回滚事务,会回退到开启事务时的状态。
2.关闭自动提交事务
通过修改MySQL全局变量"autocommit",取消自动提交事务
- 使用SQL语句: show variables like ‘%commit%’; 查看MySQL是否开启自动提交事务
0:OFF(关闭自动提交) 1:ON(开启自动提交) - 取消自动提交事务,设置自动提交的参数为OFF,执行SQL语句: set autocommit = 0;
- 在控制台执行以下SQL语句
- commit 提交任务
- 数据改变
2. 事务原理
事务开启之后, 所有的操作都会临时保存到事务日志, 事务日志只有在得到 commit 命令才会同步到数据表中,其他任何情况都会清空事务日志(rollback,断开连接)
3. 回滚点
- 开启事务 start transaction
- 执行sql
- 在执行第3个sql之后设置回滚点 savepoint abc;
- 继续执行sql
- 回到回滚点:rollback to abc;
三. 事务
1.事务的四大特性
1.原子性:事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
2.一致性:事务前后数据的完整性必须保持一致
3.隔离性:是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离,不能相互影响。
4.持久性:指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
2. 事务的隔离级别
事务在操作时的理想状态:多个事务之间互不影响,如果隔离级别设置不当就可能引发并发访问问题。
1.脏读:一个事务读取到了另一个事务中尚未提交的数据
2.不可重复读:一个事务中两次读取的数据内容不一致,要求的是一个事务中多次读取时数据是一致的,这是事务update时引发的问题
3.幻读:一个事务中两次读取的数据的数量不一致,要求在一个事务多次读取的数据的数量是一致的,这是insert或delete时引发的问题