mysql - "SELECT ... LOCK IN SHARE MODE"和 "SELECT ... FOR UPDATE"是否必须位于事务内部?

标签 mysql select transactions sql-update

我正在阅读the documentation对于这些命令我很困惑。命令的描述提到了事务:

SELECT ... LOCK IN SHARE MODE sets a shared mode lock on any rows that are read. Other sessions can read the rows, but cannot modify them until your transaction commits. If any of these rows were changed by another transaction that has not yet committed, your query waits until that transaction ends and then uses the latest values.

For index records the search encounters, SELECT ... FOR UPDATE blocks other sessions from doing SELECT ... LOCK IN SHARE MODE or from reading in certain transaction isolation levels. Consistent reads will ignore any locks set on the records that exist in the read view. (Old versions of a record cannot be locked; they will be reconstructed by applying undo logs on an in-memory copy of the record.)

但是这些示例并没有显示正在使用的事务。在没有事务的情况下运行测试命令,例如 select * from users for update; 不会导致任何错误(它有效)。这是否意味着事务不必与这些命令一起使用?如果是这样,将这些命令放入事务中是否有任何优势?

最佳答案

在 InnoDB 中,每个查询实际上都在事务中运行。如果您没有显式启动事务(使用启动事务或将自动提交设置为关闭),则每个事务都会在查询运行后提交。这意味着,如果您不在事务中,则查询完成后,通过 SELECT ... IN SHARE MODE 获取的锁将立即释放。没有什么可以阻止您这样做,只是在事务之外使用锁没有多大意义;因为这些锁是为了保证您选择的值在您要执行的后续查询之前不会更改(例如,如果您想根据另一个表中的值插入/更新一个表中的数据)

关于mysql - "SELECT ... LOCK IN SHARE MODE"和 "SELECT ... FOR UPDATE"是否必须位于事务内部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27414540/

相关文章:

php - Laravel 获取前 5 个 foreach

java - 在事务内进行无事务 EJB 调用

Java - 启发式异常

mysql 到 mariadb 恢复备份

Python MySQL 连接器 : caching_sha2_password plugin

mysql - 无法安装 mysql-connector-java,没有可用的包

php - 无法从表中选择,但我可以插入和创建?

mysql - 获取三个不同表中包含相同 id 的所有行

mysql - Sql select 查询只返回最后一行 n 次

sql-server - SQL Server 事务较大,然后偶尔出现命令超时