并发产生的数据不一致有:丢失修改,读脏数据,不可重复读
两种锁:S锁(共享锁,读锁),X锁(排它锁,写锁)
加S锁后,本事务就只能读取数据而不能修改。其他事务可以加S锁来读取数据,但不能加X锁修改数据。
即:只要数据上有S锁,任何事务都只能再对其加S锁读取,而不能加X锁修改。
加X锁后,本事务可以读取和修改数据。其他事务不能加任何锁,从而也不能读取和修改数据。
封锁协议有:三级封锁协议以及两段锁协议
一级封锁协议:写数据前加X锁,事务结束释放X锁。解决丢失修改问题。
二级封锁协议:一级之上,读数据前加S锁,读完释放S锁。一级之上解决读脏数据问题。三级封锁协议:二级之上,事务结束才释放S锁。二级之上解决不可重复读问题。
两段锁协议(2PL):读数据前加S锁,写数据前加X锁,事务结束时才释放。当要修改数据时,事务应对已加的S锁升级为X锁。
事务释放一个封锁后,不再申请其它任何封锁。即一个事务如果对不同数据加锁,解锁都是放到后面一块儿进行的。注意,以前一直弄错,这儿是一个事务,如果是并发事务,A事务的解锁可以放到B事务之前。
两段锁协议解决的是事务并发时的正确调度,并不能解决死锁。
注意:如果两个事务都对同一数据有读和写,那么可以不加S锁,直接上X锁。