《数据库原理及应用教程-MySQL8.0》课件汇总 尹志宇 第6--13章 数据库查询---数据库的备份与恢复.ppt
10.2.4锁的分类数据库引擎使用不同类型的锁锁定资源,这些锁确定了并发事务访问资源的方式。MyISAM的表锁在执行查询操作(select)前,会自动给涉及的所有表加读锁;在执行更新操作(insert、update、delete等)前,会自动给涉及的所有表加写锁。(1)读锁读锁又叫共享锁(SharedLock,S锁),该锁允许并发事务读取(SELECT)一个资源。资源上存在S锁时,任何其它事务都不能修改数据。10.2.4锁的分类(2)写锁写锁也叫排它锁(ExclusiveLock,X锁),该锁可以防止并发事务对资源进行访问,其它事务不能读取或修改X锁锁定的数据。即X锁锁定的资源只允许进行锁定操作的程序使用,其它任何对它的操作均不会被接受。执行数据更新命令即INSERT、UPDATE或DELETE命令时MySQL会自动使用X锁,但当对象上有其它锁存在时无法对其加X锁。MyISAM表的读操作与写操作之间、以及写操作之间是串行的。10.2.4锁的分类MyISAM在执行查询语句前,会自动给涉及的所有表加读锁,在执行更新操作前,会自动给涉及的表加写锁,这个过程并不需要用户干预。当写进程和读进程同时请求同一个MyISAM表的写锁和读锁时,写进程会优先获得锁。即使读请求先于写请求到达锁等待队列,写锁也会插到读锁请求之前。因为MySQL认为写请求一般比读请求更重要,所以MyISAM表不太适合有大量更新操作和查询操作的应用,因为大量的更新操作会造成查询操作很难获得读锁,从而可能永远阻塞。10.2.4锁的分类2.InnoDB的锁InnoDB的行锁有两种:共享锁(S)和排他锁(X)。为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB还有两种内部使用的意向锁:意向共享锁(IS锁)和意向排他锁(IX锁),这两种意向锁(IntentLock)都是表锁。一个事务在给数据行加锁之前必须先取得对应表对应的意向锁。10.2.4锁的分类(1)IS锁IS锁表示某事务有读取低层次资源的意向,把S锁放在这些低层次的单个资源上。也就是说,如果对一个数据对象加IS锁,表示它的后裔资源拟(意向)加S锁。例如,要对某个元组加S锁,则要首先对包含该元组的表加IS锁。(2)IX锁IX锁表示某事务有修改低层次资源的意向,把X锁放在这些低层次的单个资源上。也就是说,如果对一个数据对象加IX锁,表示它的后裔资源拟(意向)加X锁。例如,要对某个元组加X锁,则要首先对包含该元组的表加IX锁。9.3.2创建事件【例9-21】每天凌晨3点自动删除bankcard数据库account表中过期的账户的数据。CREATEEVENTevent_del_records_expireONSCHEDULEEVERY1DAYSTARTS2022-01-0103:00:00DODELETEFROMaccountWHEREDATEDIFF(ExpiryDate,CURDATE())=0;9.3.2创建事件【例9-22】创建事件,实现每个月的第一天凌晨1点统计一次储户人数和账户个数,并插入到统计表中。(1)创建名称为p_total的存储过程,用于统计储户人数和账户个数,并插入到统计表tb_total中。首先创建tb_total表。USEbankcard;CREATETABLEtb_total(insert_timedatetimePRIMARYKEY,depositor_numberint,account_numberint);9.3.2创建事件然后创建p_total存储过程。USEbankcard;DELIMITER//CREATEPROCEDUREp_total()BEGINDECLAREn1,n2int;SELECTCOUNT(*)INTOn1FROMdepositor;SELECTCOUNT(*)INTOn2FROMaccount;INSERTINTOtb_totalVALUES(NOW(),n1,n2);END//9.3.2创建事件(2)创建事件event_autototal,每个月的第一天凌晨1点调用存储过程p_total。CREATEEVENTevent_autototalONSCHEDULEEVERY1MONTHSTARTSDATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVALDAY(CURDATE()-1)DAY),INTERVAL1