1,读写锁
读锁是共享锁,所有读操作都可以获取,写锁是拍他锁,可以阻塞其他读和写操作
2,锁粒度
表级别的锁和行级别的锁,表锁是开销最小的锁,会将整张表锁住,一个用户在对表进行写操作时,需要先获取写锁,这会阻塞其他用户对该表的所有读写操作,只有没有写锁时,其他读取的用户才能获取读锁,读锁之间互不干扰。
3,行及锁
行及锁可以最大程度的支持并发处理,但同时也带来了巨大的锁开销,mysql innodb的行及锁只在存储引擎层实现,服务器层没有实现。
4,事务特性 ACID
A:原子性 一个事务必须被视为一个不可分割的最小执行单元,整个事务要么成功要么失败回滚,不可能只执行事务的一部分。
C:一致性 数据库总是从一个一致性状态转为另一个一致性状态。
I:隔离性 一个事务所做的修改在提交前对于其他事务是不可见的。
D:一旦事务提交,其所做的修改就会永久保存到数据库中
5,事务的隔离级别
read uncommitted
读未提交,事务的修改,即使没有提交也会被其他事物看见,事务可以读取未提交的数据,称为脏读
read committed
大多数数据库的默认隔离级别是读已提交,mysql除外,一个事务从开始执行到提交,所做的修改只有在提交之后才会对其他事务可见。也叫不可重复读
repeatable read
可重读,同一个事务中多次读取同样记录的结果是一致的,但在理论上,可重复读无法解决幻读的为题,当事务在读取某个范围内的数据时,如果其他事务做了插入操作,同一事务前后两次读取的结果就会不一致,innodb通过mvvc,多版本并发控制解决了幻读的问题
serializable
强制控制事务串行执行,在事务读取所有记录上加锁,但为造成大量的锁争用和超时。
6,死锁
死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而产生恶性循环的现象。
mysql innodb处理的死锁的方法是:将持有最少行及拍他锁的事务进行回滚,死锁的产生有双重原因,有些是因为真正的数据冲突,通常难以避免,有些是因为存储引擎的实现方式导致的。