For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
锁的应用对于软件开发线程安全还是有很大的帮助作用的,今天我们就通过案例分析来简单了解一下,数据库锁的类型与级别分析。
一、乐观锁和悲观锁
乐观锁和悲观锁在数据库和多线程并发中常被提及,但它们并不是某两个特定的锁,而是两个锁的宏观理念。
悲观锁:认为数据随时会被修改,因此每次读取数据之前都会上锁,防止其它事务读取或修改数据。应用于数据更新比较频繁的场景。
乐观锁:操作数据时不会上锁,但是更新时会判断在此期间有没有别的事务更新这个数据,若被更新过,则失败重试。适用于读多写少的场景。
乐观锁的实现方式有:
(1)加一个版本号或者时间戳字段,每次数据更新时同时更新这个字段。
(2)先读取想要更新的字段或者所有字段,更新的时候比较一下,只有字段没有变化才进行更新。
二、常见的封锁级别
意向锁是InnoDB(MySQL加的数据引擎)自动加的,不需要用户干预。对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X)。对于普通SELECT语句,InnoDB不会加任何锁。事务可以通过以下语句显式给记录集加共享锁或排他锁:共享锁(S):SELECT*FROMtable_nameWHERE...LOCKINSHAREMODE。其他session仍然可以查询记录,并也可以对该记录加sharemode的共享锁。但是如果当前事务需要对该记录进行更新操作,则很有可能造成死锁。排他锁(X):SELECT*FROMtable_nameWHERE...FORUPDATE。其他session可以查询该记录,但是不能对该记录加共享锁或排他锁,而是等待获得锁。
排它锁(ExclusiveLock)/X锁:事务对数据加上X锁时,只允许此事务读取和修改此数据,并且其它事务不能对该数据加任何锁。
共享锁(SharedLock)/S锁:加了S锁后,该事务只能对数据进行读取而不能修改,并且其它事务只能加S锁,不能加X锁。
意向锁(IntentionLocks):一个事务在获得某个数据行对象的S锁之前,必须先获得整个表的IS锁或更强的锁。一个事务在获得某个数据行对象的X锁之前,必须先获得整个表的IX锁。IS/IX锁之间都是兼容的。
好处:如果一个事务想要对整个表加X锁,就需要先检测是否有其它事务对该表或者该表中的某一行加了锁,这种检测非常耗时。有了意向锁之后,只需要检测整个表是否存在IX/IS/X/S锁就行了锁的作用:用于管理对共享资源的并发访问,保证数据库的完整性和一致性。
封锁粒度:
MySQL中提供了两种封锁粒度:行级锁以及表级锁。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。