前言
mysql因为其开源性质和性能优越比较受大家欢迎的一种RDBMS。随着mysql的几经易主,也吸取了一些前几任东家的工程师解决方案的优势,本章着重介绍下mysql的一些架构、锁、事务的介绍。
一、mysql服务器架构
二、锁
读锁,也称为共享锁(shared lock),多个客户端在同一时刻可以同时读取同一个资源,而且互不干扰。
写锁,也称为排他锁(exclusive lock),一个写锁会阻塞其他的写锁和读锁。
锁策略:是在锁的开销和数据的安全性之间寻求平衡,可以分为表锁和行锁。
表锁,写操作时会锁定整个表,阻塞其他用户对该表的所有读写操作,开销最小。
行锁,最大程度支持并发同时开销也很大,行锁是在存储引擎层实现而不是在mysql服务器层实现。InnoDB和XtraDB可以实现。
死锁,是指两个或者多个事务在同一个资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。数据库设计有死锁检测和超时机制,可以有效避免死锁状态的持续,某些特定情况下需要人工干预。
三、事务
事务的特性
原子性(Atomicity),指事务包含的所有操作要么全部成功,要么全部失败回滚。
一致性(Consistency),一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态.
隔离性(Isolation),多个并发事务之间要相互隔离,一个事务所做修改在提交之前是对其他事务不可见的。
持久性(Durability),持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
作者:MomokaJunko
链接:https://juejin.cn/post/6844904183922065421
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1.隔离级别
隔离级别 | 脏读可能性 | 不可重复读可能性 | 幻读可能性 | 加锁表 |
---|---|---|---|---|
READ UNCOMMITED | yes | yes | yes | yes |
READ COMMITED | No | Yes | yes | No |
REPEATABLE READ | No | No | Yes | No |
SERIALIZABLE | No | No | No | No |
查看事务隔离级别
mysql> show global variables like "transaction_isolation%";
+-----------------------+-----------------+
| Variable_name | Value |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.00 sec)
read uncommitted(未提交读),指事务中的修改即使没有提交,对其他事务也都是可见的。会造成脏读。
read commmited(提交读),一个事务没有commit之前其他事务看不到修改的内容。
repeatable read(可重复读),mysql默认隔离级别,同一个事务多次读取同样记录的结果是一致的。可能会出现幻读的情况。
serializable(可串行化),最高隔离级别,强制事务串行执行,避免出现幻读。serializable会在读取每一行数据上都加锁,所以可能导致大量的超时和锁的问题。