mysql总结

数据库设计规范

第一范式:数据库表中的每一列都是不可分割的原子数据项
第二范式:满足第一范式的条件下,所有非主属性都完全依赖于主键
第三范式:满足第一范式和第二范式的条件下,数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系(每张表只描述一个事物)

数据库引擎

MyISAM(早年使用) INNODB(现在使用)
事务支持 不支持 支持(两个语句要么都执行要么都不执行)
数据行锁定(行锁) 不支持(表锁) 支持(操作数据时只锁定要操作的行)
外键约束 不支持 支持
全文索引 支持 不支持(查询)
表空间大小 较小 较大(约为MyISAM的2倍)
delete删除问题 不会影响自增(存在文件中,不会丢失) 自增归0(存在内存中断电即失)

事务的ACID属性:atomicity(原子性),consistent(一致性),isolation(持久性),durable(隔离性)。

并发事务带来的几个问题:更新丢失,脏读,不可重复读,幻读。

事务隔离级别:未提交读(Read uncommitted),已提交读(Read committed),可重复读(Repeatable read),可序列化(Serializable)

四种隔离级别的比较

  1. 读未提交(Read uncommitted):

这种事务隔离级别下,select语句不加锁。

此时,可能读取到不一致的数据,即“读脏 ”。这是并发最高,一致性最差的隔离级别。

  1. 读已提交(Read committed):避免脏读 脏读是指一个事务在处理数据的过程中,读取到另一个为提交事务的数据。

可避免 脏读 的发生。

在互联网大数据量,高并发量的场景下,几乎 不会使用 上述两种隔离级别。

  1. 可重复读(Repeatable read):避免不可重复读 不可重复读是指对于数据库中的某个数据,一个事务范围内的多次查询却返回了不同的结果,这是由于在查询过程中,数据被另外一个事务修改并提交了。 (默认隔离级别)

MySql默认隔离级别。

可避免 脏读 、不可重复读 的发生。

  1. 串行化(Serializable ):避免幻读 幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。 解决不可重复读的方法是 锁行,解决幻读的方式是 锁表。

可避免 脏读、不可重复读、幻读 的发生。

以上四种隔离级别最高的是 Serializable 级别,最低的是 Read uncommitted 级别, 当然级别越高,执行效率就越低 。像 Serializable 这样的级别,就是以 锁表 的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读) 。

在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读) ;而在 Oracle数据库 中,只支持Serializable (串行化) 级别和 Read committed (读已提交) 这两种级别,其中默认的为 Read committed(读已提交) 级别。

查询隔离级别


select @@tx_isolation;

set tx_isolation='隔离级别';    --read-uncommitted    read-committed    repeatable-read    serializable
set tx_isolation='read-uncommitted';
 
select @@tx_isolation;
posted @ 2022-02-21 19:34  一刹流云散  阅读(19)  评论(0编辑  收藏  举报