事务:
-
四大特性ACID:原子性(
Atomicity
)、一致性(Consistency
)、隔离性(Isolation
)、持久性(Durability
)。- 原子性:事务包含的所有操作要么全部成功,要么全部失败回滚
- 一致性:一个事务执行之前和之后都必须处于一致的状态,比如a与b账户共有1000块,两人之间转账之后无论成功还是失败,账户总和还是1000块
- 隔离性:跟隔离级别相关,如read committed,一个事务只能读到已提交的修改
- 持久性:一旦被提交,对事务的修改是永久的,即便是在数据库系统中遇到故障的情况都不会丢失提交事务的操作
-
事务隔离级别:
先了解以下几个概念
- 脏读:一个事务处理过程里读取了另一个未提交的事务中的数据
- 不可重复读:对于在数据库中的某行记录,一个事务范围内多次查询却返回了不同的数据值,是由于在查询间隔,另一个事务修改并提交了数据。
- 幻读:某个事务在读取某个范围内的数据时,另外一个事务又在该范围内插入了新的记录。
事务隔离就是为了解决以上的问题。MySQL数据库提供了四种隔离级别(以下按隔离级别由高到低),隔离性越高,并发性越低,数据越可靠,性能越低。
- 串行化(Serializable):强制事务排序,避免幻读的发生
- 可重复读(Repeatable read,RR):MySQL的默认事务隔离级别,确保同一事务的多个实例在并发读取数据时,会看到同样的数据行,解决了不可重复读的问题
- 读已提交(Read committed,RC):一个事务只能读取已提交的修改。避免脏读的发生
- 读未提交(Read uncommitted,RU):所有事务都可以看到其他未提交事务的执行结果。
查看隔离级别:
select @@transaction_isolation
设置隔离级别:
set session transaction isolation level read uncommitted
- 生产环境数据库一般使用RC,读已提交
- 在RR下,存在间隙锁,会导致出现死锁的概率比RC大得多(死锁有四个特点,互斥使用,循环等待,占有且等待,不可抢占,可以通过
jstack 程序名
查看死锁 - 在RR下,条件列未命索引会锁表。在RC下,只锁行。
- 在RR下,存在间隙锁,会导致出现死锁的概率比RC大得多(死锁有四个特点,互斥使用,循环等待,占有且等待,不可抢占,可以通过
- 互联网项目中mysql应该选择RC
-
开启事务:
start transaction
,提交事务:commit
,回滚:rollback
,事务必须以commit或rollback结尾。
范式,三大范式
- 第一范式1NF,确保数据库表字段的原子性。比如字段
userInfo
:广东省 10086'
,依照第一范式必须拆分成userInfo
:广东省
userTel
:10086
两个字段。 - 第二范式2NF,必须满足第一范式,另外,必须有一个主键,且非主键列必须完全依赖于主键
- 第三范式3NF,必须满足第二范式,另外,非主键列必须直接依赖于主键,不能存在传递依赖
编码与字符集
- 为了统一各类编码格式,出现了Unicode编码格式,用两个字节表示,而ASCII码是一个字节。为了剩下空间,出现了UTF-8编码。
- 按照一定规则把符号和二进制码对应起来,就是编码,而把这些字符聚在一起,就是字符集。比如,utf-8字符集就是所有utf-8编码格式的字符的合集。查看mysql支持哪些字符集:
show charset