4-24 ACID 数据库四大特性
A:原子性(Atomicity),要么做完,要么不做,举个例子,A给B转钱,不会出现A转了钱,B没有收到钱
C:一致性(Consistency),从一个状态到另一个状态是一致的,再举个例子,A给B转钱,不会出现A转了100块,B只得到了50块.
I:隔离性(Isolation),一个事务在未提交之前,对其他事务来说,是不可见的,这里有四个隔离等级.
D:持续性(Durabilty),一旦事务提交,将会将会永远保存在数据库里.
4-24 四个隔离等级 & 脏读 不可重复读 幻读
分别为读未提交,读提交,可重复读,序列化,读未提交 什么也防不了,读提交防脏读,可重复读在读提交的基础上还能防止不可重复读,序列化在可重复读的基础上,还能防止幻读.
下面来说说 什么是脏读,不可重复读,幻读
脏读,一个事务读取了另一个事务未提交的数据. 举个例子,A要给B100块,但是没提交事务,这个时候B去看看自己的支付宝,多了100块,但是A想了想,还是不给了,就没有提交.虽然B看到多了100块,但是实际100块钱也没有得到.
不可重复读,一个事务读取了数据的时候,另一个事务在update或者delete,再次读取的时候,数据读取不同. 举个例子,A看了看自己的支付宝有100块钱,想去买东西准备付钱,这个时候B从A的支付宝里转走了100块,并在A付账前(提交事务)转走,这个时候,A认为自己是有钱的,但是却支付失败.
幻读,一个事务读取数据的时候,另一个事务执行insert,再次读取的时候,发现读取数据不同,举个例子,A在看支付宝消费记录的时候,B用A的支付宝消费了100块,A刷新支付宝消费记录的时候,突然多了100块,他认为自己出现了幻觉.
四个隔离等级,依次效率降低,降低并发性.
4-25 乐观锁与悲观锁
乐观锁与悲观锁,我想了想,还是放到了数据库相关知识里.
乐观锁:假定不会发生并发冲突,所以在所需数据之外,还需要一个版本号version,来确定当前做出的修改,在保存的时候,是否是基于上一个版本的.乐观锁的优点又是不会用数据库大量资源,适合并发的环境.但是这是有条件的,这仅仅是针对写操作较少的情况下.如果一直版本号不对应(也就是写操作过,导致版本号更新过快),那么占用的资源不一定比悲观锁少.CAS就是一种乐观锁.
悲观锁,正好与乐观锁相反,是一种假定会发生并发冲突的锁.所以,在修改数据前,它首先会取得锁,让其他事务暂时无法取得它所取得的数据.这样会占用数据库大量资源.synchronized就是一种悲观锁.
4-27 数据库锁机制
数据库锁有三种表级,页级,行级,三种锁的并发能力依次由小到大递增.
表级:是对访问数据所在表加锁,这样粒度虽然变大,但是也降低了并发能力.
行级:对访问数据加锁,这样虽然降低了发生冲突的可能,但是因为粒度小,对数据的加锁解锁也对数据库效率造成一定影响.
页级:锁机制在表级和行级之间,并发能力和数据库效率都处于表级和行级之间.
5-8 mysql索引失效
1. 当使用is null
2. 使用like进行模糊查询
3. 使用不等于 (!= <>)
4. 当mysql估计全表查询比使用索引快的时候
5. 查询字符串的时候 没有使用单引号