1.mysql的事务
什么是事务?维基百科的定义:事务是数据库管理系统(DBMS)执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成
事务的四大特性:ACID。即原子性,一致性,隔离性,持久性
原子性:每个事务都是不可分割的最小单位,就像原子一样
一致性:数据库从一种状态转化成另一种状态
隔离性:事务对其他事务是隔离的不可见的,它通过锁机制实现
持久性:事务提交成功, 数据修改就是永久的
事务的隔离级别:
隔离级别与脏读、幻读、不可重复读的关系
隔离级别 |
脏读 |
不可重复读 |
幻读 |
READ UNCOMMITED (读未提交) |
允许 |
允许 |
允许 |
READ COMMITED (读提交) |
不允许 |
允许 |
允许 |
REPEATABLE READ (可重复读) |
不允许 |
不允许 |
允许 |
SERIALIZABLE (串行化) |
不允许 |
不允许 |
不允许 |
2.锁机制
相比其他数据库而言,mysql的锁机制比较简单,而且不同的存储引擎支持不同的锁机制
MyISAM 和 Memory 存储引擎使用的是表级锁,BDB 引擎使用的是页级锁,也支持表级锁。由于 BDB 引擎基本已经成为历史,因此就不再介绍了。
3.innodb锁
innodb与myisam的相当大的两点不同在于:1.支持事务,2.采用行级锁
表级锁没有与行级锁的实现差别就很大,而事务的引入也带来了很多新问题,尤其是事务的隔离性,与锁的机制息息相关
数据库实现事务隔离的方式可以分为两种:
1.在操作数据之前,对其加锁,防止其他事务对数据进行修改。但这个需要事务串行化
2.不加锁,特点时间内对数据进行快照,产生多个版本的数据库,即mvcc
4.innodb的锁类型:
innodb实现了下面两种类型的锁:共享锁,排它锁
如果一个事务请求的锁模式与当前的锁兼容,InnoDB 就将请求的锁授予该事务,如果两者是冲突的,那么该事务就要等待锁释放。
6.间隙锁
当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(NEXT-KEY)锁。
7.行锁升级为表锁