数据库
在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对同一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。
丢失修改:就是事务A 做了-10操作 然而 事物B在同时也做了-10操作 导致结果错误
不可重复读: 事务A 先读取了一条数据 但事物没结束,事物B对这条数据进行了修改,再次读取这条数据的时候,和第一次读取的数据不一样
读脏数据:事务T1修改某个数据并写回磁盘,事务T2读取同一数据,但T1由于某种原因撤销了,这时T1修改过的数据恢复原来的值,T2读取的数据就与数据库中的数据不一致。
幻读:事务A 对表A 的数据加10,事物B也是加10,事物A、B读取的数据不一样
隔离级别的实现
锁
锁是一种最为常见的并发控制机制,在一个事务中,我们并不会将整个数据库都加锁,而是只会锁住那些需要访问的数据项, MySQL 和常见数据库中的锁都分为两种,共享锁(Shared)和互斥锁(Exclusive),前者也叫读锁,后者叫写锁。读锁保证了读操作可以并发执行,相互不会影响,而写锁保证了在更新数据库数据时不会有其他的事务访问或者更改同一条记录造成不可预知的问题。
时间戳
除了锁,另一种实现事务的隔离性的方式就是通过时间戳,使用这种方式实现事务的数据库,例如 PostgreSQL 会为每一条记录保留两个字段;读时间戳中包括了所有访问该记录的事务中的最大时间戳,而记录行的写时间戳中保存了将记录改到当前值的事务的时间戳。使用时间戳实现事务的隔离性时,往往都会使用乐观锁,先对数据进行修改,在写回时再去判断当前值,也就是时间戳是否改变过,如果没有改变过,就写入,否则,生成一个新的时间戳并再次更新数据,乐观锁其实并不是真正的锁机制,它只是一种思想,在这里并不会对它进行展开介绍。
并发控制
最为常见的三种并发控制机制:
悲观并发控制:悲观并发控制其实是最常见的并发控制机制,也就是锁
乐观并发控制:即乐观锁,乐观锁其实并不是一种真实存在的锁
多版本并发控制(MVCC):与前两者对立的命名不同,MVCC 可以与前两者中的任意一种机制结合使用,以提高数据库的读性能
mysql 索引
索引在MySQL中也叫做“键”或者"key"(primary key,unique key,还有一个index key),是存储引擎用于快速找到记录的一种数据结构
mysql索引结构分析
假定mysql的数据结构是二叉查找树(大的放右边,小的放左边),键值为索引值,data为存储在磁盘地址的指针,这样存在一种弊端,当索引值是递增的时候,二叉查找树显示出来的类似于链表的形式。