Row-Level Locking (323)

Both read committed and serializable transactions use row-level locking, and both will
wait if they try to change a row updated by an uncommitted concurrent transaction.
The second transaction that tries to update a given row waits for the other transaction
to commit or undo and release its lock. If that other transaction rolls back, the waiting
transaction, regardless of its isolation mode, can proceed to change the previously
locked row as if the other transaction had not existed.

However, if the other blocking transaction commits and releases its locks, a read
committed transaction proceeds with its intended update. A serializable transaction,
however, fails with the error Cannot serialize access error, because the other
transaction has committed a change that was made since the serializable transaction
began.

行级锁
1. 已提交读取与串行化都采用行级锁技术 , 他们在更新未提交的并发事务修改的数据行时
都会发生等待 , 等待未提交的并发事务提交或撤销,释放锁 . 如果其他的事务回滚 ,
两者都都能修改之前被锁住的数据行,如同未提交的并发事务不存在一样
2. 当导致阻塞的事务交并释放了锁后 , 已提交读写模式下的等待事务就能够继续执行其中的更新
操作 , 而在串行化模式下的等待事务将出现无法进行串行化访问的错误

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10599713/viewspace-989547/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10599713/viewspace-989547/

### MySQL 实现行锁的方法及语法 在 MySQL 中,行级锁定(Row-Level Locking)是一种细粒度的锁定机制,主要用于提高数据库的并发性能,同时防止数据冲突。行锁主要由存储引擎实现,而不是由 MySQL 服务器层直接管理。以下详细介绍如何在 MySQL 中实现行级锁定以及相关语法。 #### 1. 存储引擎支持 行级锁定通常由 InnoDB 存储引擎支持,而 MyISAM 存储引擎仅支持表级锁定[^4]。因此,如果需要使用行级锁定,必须确保表的存储引擎为 InnoDB。 ```sql -- 查看表的存储引擎 SHOW TABLE STATUS WHERE Name = 'your_table_name'; -- 修改表的存储引擎为 InnoDB ALTER TABLE your_table_name ENGINE=InnoDB; ``` #### 2. 行锁的实现方式 InnoDB 使用两种类型的行锁:共享锁(Shared Locks)和排他锁(Exclusive Locks)。以下是具体实现方法: - **共享锁(SELECT ... LOCK IN SHARE MODE)** 共享锁允许其他事务读取同一行数据,但禁止修改或删除该行数据。 ```sql SELECT * FROM table_name WHERE id = 1 LOCK IN SHARE MODE; ``` - **排他锁(SELECT ... FOR UPDATE)** 排他锁禁止其他事务读取、修改或删除该行数据,通常用于事务中以确保数据一致性。 ```sql SELECT * FROM table_name WHERE id = 1 FOR UPDATE; ``` #### 3. 意向锁与行锁的关系 为了协调不同粒度的锁,InnoDB 引入了意向锁(Intention Locks)。意向锁本身不会直接锁定行,而是表明某个事务计划对特定行加锁。可以通过以下查询查看当前的锁状态: ```sql SELECT object_schema, object_name, index_name, lock_type, lock_mode, lock_data FROM performance_schema.data_locks; ``` 这有助于诊断死锁或其他锁问题[^3]。 #### 4. 死锁处理 行锁可能导致死锁问题。InnoDB 自动检测死锁并回滚其中一个事务以解决冲突。可以通过以下参数调整死锁检测行为: ```sql -- 查看当前死锁超时时间 SHOW VARIABLES LIKE 'innodb_lock_wait_timeout'; -- 设置死锁超时时间为5秒 SET GLOBAL innodb_lock_wait_timeout = 5; ``` #### 5. 注意事项 - 行锁仅适用于索引列。如果查询条件未命中索引,则可能升级为表锁。 - 频繁的行锁操作可能引发性能瓶颈,需合理设计事务逻辑[^1]。 ### 示例代码 以下是一个简单的事务示例,展示如何使用行锁: ```sql START TRANSACTION; -- 加排他锁 SELECT * FROM accounts WHERE account_id = 101 FOR UPDATE; -- 更新账户余额 UPDATE accounts SET balance = balance - 100 WHERE account_id = 101; COMMIT; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值