一,数据库事务
1.事务概念
指作为一个不可分割的逻辑工作单元的一系列数据库操作。事务可以包含一条或多条数据库操作语句,这些语句被视为一个整体。事务的目标是确保数据库在多个操作之间保持一致性和完整性。
2.事物特性
ACID特性
• 原⼦性(Atomicity):⼀个事务中的多个DML操作,要么同时执⾏成功,要么同时执⾏失败。如果事务中的任何一个操作失败,所有操作都会被回滚,使数据库恢复到执行事务前的状态。
• ⼀致性(Consistency):事务执⾏之前和事务执⾏之后,数据库中的数据是⼀致的,完整性和 ⼀致性不能被破坏
• 隔离性(Isolation):数据库允许多个事务同时执⾏(张三借Java书的同时允许李四借Java 书),多个必⾏的事务之间不能相互影响
• 持久性(Durability):事务完整之后,对数据库的操作是永久的
3.MySQL事务管理
•⾃动提交
在MySQL中,默认DML指令的执⾏时⾃动提交的,当我们执⾏⼀个DML指令之后,⾃动同步到数 据库中
•事务管理
开启事务,就是关闭⾃动提交
◦ 在开始事务第⼀个操作之前,执⾏ start transaction 开启事务
◦ 依次执⾏事务中的每个DML操作
◦ 如果在执⾏的过程中的任何位置出现异常,则执⾏ rollback 回滚事务
◦ 如果事务中所有的DML操作都执⾏成功,则在最后执⾏ commit 提交事务
4.事务隔离级别
事务的隔离级别(isolation level)是指多个并发事务之间相互隔离的程度。数据库管理系统使用隔离级别来控制事务之间的相互影响,确保并发事务执行的正确性和一致性。
常见的事务隔离级别包括:
1. 读未提交(Read Uncommitted):最低的隔离级别,事务可以看到其他事务尚未提交的修改。这种隔离级别允许脏读(Dirty Read),即读取到了其他事务未提交的数据。
2. 读已提交(Read Committed):事务只能看到已经提交的数据,不能读取到其他事务尚未提交的数据。这种隔离级别避免了脏读,但可能出现不可重复读(虚读),即在同一个事务内,多次读取同一数据的结果可能不一致。
3. 可重复读(Repeatable Read):事务开始时确定一个一致的快照视图,并在整个事务期间保持一致。其他事务对数据的修改在当前事务提交之前不可见。这种隔离级别避免了不可重复读,但可能出现幻读,例 T2对数据表中的数据进⾏修 改然后查询,在查询之前T1向数据表中新增了⼀条数据,就导致T2以为修改了所有数据,但却查询出了与修改不⼀致的数据(T1事务新增的数据)
4. 串行化(Serializable):最高的隔离级别,确保每个事务都像是在系统中独立执行的。所有事务按照顺序依次执行,避免了脏读、不可重复读和幻读的问题。但由于保证了严格的事务顺序,会导致并发性能降低。
5.设置数据库事务隔离级别
MySQL数据库默认的隔离级别为 可重复读
•查看MySQL数据库默认的隔离级别
# 在MySQL8.0.3 之前
select @@tx_isolation;
# 在MySQL8.0.3 之后
select @@transaction_isolation;
•设置MySQL默认隔离级别
set session transaction isolation level <read committed>;
二,数据库设计
1.三范式
1.第⼀范式 :要求数据表中的字段(列)不可再分。即确保每个属性都是原子的。表中的每个列都应该包含一个单一的值,而不是多个值或重复的值。此外,每个列都应该有一个唯一的名称,并且在表中有一个唯一的标识
2.第⼆范式 :不存在⾮关键字段对关键字段的部分依赖 。即在满足第一范式的基础上,消除非主键属性对部分主键属性的部分依赖。如果一个表中存在多个列组合形成的主键,那么每个其他列都应该完全依赖于这个组合主键,而不是部分依赖。如果有列与部分主键相关,那么它们应该被移至另一个表中。
3.第三范式 :不存在⾮关键字段之间的传递依赖。即在满足第二范式的基础上,消除非主键属性对主键的传递依赖。如果一个表中某些列依赖于其他非主键列,而不是直接依赖于主键,那么应该将这些依赖关系拆分为独立的表,以避免数据冗余和不一致性。