共享锁(Shared Lock)
共享锁,也被称为读锁(Read Lock),它允许多个事务同时对同一数据资源进行读取操作,但不允许任何事务对数据进行修改。
换句话说,共享锁保证了数据的共享读特性。
特点
1. 共享性:多个事务可以同时持有相同的共享锁,并发读取数据。 2. 不阻塞其他共享锁:一个事务持有共享锁不会阻止其他事务获取相同的共享锁。 3. 阻塞独占锁(排他锁):如果一个事务已经持有了共享锁,其他事务如果要获取排他锁,则需要等待共享锁释放。
使用场景
共享锁主要应用在需要同时读取同一数据资源的场景,如一致性读取和长时间读取操作。
通过共享锁,可以确保数据在读取过程中不会被其他事务修改。
示例
假设我们有一个用户表 users
,现在我们要在事务中读取某个用户的信息,并确保在事务结束之前,这条记录不会被其他事务修改。
START TRANSACTION;
SELECT * FROM users WHERE id=1 LOCK IN SHARE MODE;
在这个例子中,LOCK IN SHARE MODE
子句会对 id=1
的行加上共享锁,其他事务可以读取这行数据,但无法对其进行更新或删除。
排他锁(Exclusive Lock)
排他锁,也被称为写锁(Write Lock),它允许事务对记录进行修改操作时,防止其他事务同时读取或修改这些记录。
排他锁保证了数据的独占性。
特点
1. 独占性:只能有一个事务持有排他锁,其他事务无法获取同样的记录上的排他锁。 2. 阻止其他事务获取任何锁:如果一个事务已经持有了排他锁,其他事务无法获取共享锁或排他锁。 3. 事务级隔离:事务持有排他锁的记录只对持有该锁的事务可见,其他事务不能访问。
使用场景
排他锁主要应用于需要修改数据的场景,如插入、更新和删除操作。
通过排他锁,可以确保数据在修改过程中不会被其他事务读取或修改,从而避免数据不一致的问题。
示例
假设我们需要更新某个用户的信息,并希望在事务期间确保其他事务不能读取或修改该数据。
START TRANSACTION;
SELECT * FROM users WHERE id=2 FOR UPDATE;
在这个例子中,FOR UPDATE
子句会对 id=2
的行加上排他锁。
在事务提交之前,其他事务无法读取或修改这行数据。
小结
共享锁和排他锁是MySQL中用于控制并发访问的基本锁类型。
通过合理地使用锁,可以有效地管理并发事务,提高系统的稳定性和效率。
• 共享锁:允许并发读取,但不允许修改。
适用于读取操作。
• 排他锁:允许独占访问,既不允许读取也不允许修改。
适用于写入操作。
在实际开发中,根据具体业务需求选择合适的锁类型,可以确保数据的一致性和完整性。
你诺喜欢,请点个关注哦