锁的作用
锁是为了控制对共享资源的并发访问和操作。数据库系统使用锁是为了支持对共享资源进行并发访问,提供数据的完整性和一致性。
两种锁的概念:
Latch:闩锁,这是一种轻量级锁,用于线程中的临界资源的操作【例如,操作缓冲池中的LRU列表,删除、添加、移动LRU列表中的元素,为了保证一致性,必须有锁的介入】。锁定的时间非常短,而且没有死锁检测机制。
lock:用于数据事务的锁,并且在一般在commit和rollback后释放。有死锁检测机制。
锁的类型
表锁:myisam 锁
共享锁:允许事物读取一行数据【S锁】
排它锁:允许事物更新或是删除一条数据【X锁】
myIsam对于并发操作处理方式:
MySQL对于删除和插入的处理,对于删除操作,myisam只是标记这行被删除,并没有真正的去作删除处理。在插入的时候回看看有没有标记的删除的行【成为空洞】,如果有会填补这些空洞,没有会插入到行末尾。
尽管myisam是表锁,但是也指出并发的读,并发插入的操作,读只能读取到当前的数据,新插入的数据是看不见的,这避免了非一致读问题。但是中间有些数据改动的话还是不支持非一致读。
通过设置concurrent_insert这个人值,可以改变myisam的插入并发的控制。0:MySQL不支持并发插入,所有插入都会设置互斥锁。
1:默认值,如果没有空洞就指出并发插入。
2:所有的并发插入都设置在表尾部。
Innodb:
- 共享锁【S锁】
对于共享锁,支持对于一行加了S锁,可以在加s锁,但是不支持加X锁。 - 排它锁【X锁】
对于排它锁,加了排它锁的行,不支持在加任何其他锁