MySQL数据库中拥有意向锁(Intention Locks),允许用户向MySQL查询发出可防止竞争条件(Competition Conditions)出现的请求。一句话,一个意向锁可以锁住特定的范围,以及它的等级,意思是其他事务不能改变或查看其中数据,直到意向锁释放为止。MySQL的意向锁可以帮助数据库服务器改善并发性,这是为了具有可用性和可扩展性的必要条件。
MySQL意向锁主要有两种类型:排他意向锁(X-Locks)和共享意向锁(S-Locks)。 X-Locks锁定一行或表,表示不允许其他会话对其进行改变和操作,但是可以进行查看操作。 S-Locks表示允许另一事务查看或锁定数据。
MySQL在每个会话会话标识符(Session Identifier)上分配意向锁,这可以很好地避免网络延迟和会话终止的影响。另外,意向锁也可以使用在一致性读取(Consistent Reads)事务中,只有一个会话在进行特定数据库操作时,意向锁才会提供数据一致性,确保并发访问是安全的。
MySQL中实现意向锁很容易,只需要简单地在查询语句上加上SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 语句,就可以了:
SET AUTOCOMMIT=0;
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
/* Now start a transaction and execute some SQL statements… */
SELECT Title FROM Movies WHERE Genre = ‘Action’;
/* Do some work */
UPDATE Movies SET Year = 2014 WHERE Title = ‘Fury’;
/* End of transaction */
COMMIT;
SET AUTOCOMMIT=1;
MySQL的意向锁不仅可以改善数据库的并发性,而且可以改善并发访问的性能。它有助于确保只有一个会话可以访问特定行或表,而其他会话只能等待。因此,它可以减少竞争条件的发生概率,从而使数据库的并发性得到提升。