mysql innodb 解锁_mysql – ACID事务innodb中的行锁定

根据MySQL 5.0 Certification Study Guide第7段第7段

以下命令可以破坏事务

> ALTER TABLE

>开始

>创建指数

> DROP DATABASE

> DROP INDEX

> DROP TABLE

> RENAME TABLE

> TRUNCATE TABLE

>锁定表

>解锁表格

> SET AUTOCOMMIT = 1

>开始交易

只要您在事务中没有任何这些命令,事务就应该是稳定的.实际上,SELECT FOR UPDATE非常强大,以至于行锁会侵入索引以及数据.它甚至可能引发可能的InnoDB死锁.我曾在这篇文章中写过:select for update gives error on indexed column

只要您保持交易简短和甜蜜,SELECT FOR UPDATE应该不是问题.如果您想保护您的事务免受间歇性或意外死锁的影响,MySQL 5.6现在具有以下功能:

> START TRANSACTION READ WRITE;

> START TRANSACTION READ ONLY;

您应该使用这些选项开始交易.为什么?

The READ WRITE and READ ONLY modifiers set the transaction access mode. They permit or prohibit changes to tables used in the transaction. The READ ONLY restriction prevents the transaction from modifying or locking both transactional and nontransactional tables that are visible to other transactions; the transaction can still modify or lock temporary tables. These modifiers are available as of MySQL 5.6.5.

你的最后评论是

so can i lock rows within a transaction another way other then for update

> SELECT … LOCK IN SHARE MODE在任何读取的行上设置共享模式锁定.其他会话可以读取行,但在事务提交之前无法修改它们.如果其中任何行已被另一个尚未提交的事务更改,则查询将等待该事务结束,然后使用最新值.

>对于搜索遇到的索引记录,SELECT … FOR UPDATE会锁定行和任何关联的索引条目,就像为这些行发出UPDATE语句一样.阻止其他事务更新这些行,从进行SELECT … LOCK IN SHARE MODE,或从某些事务隔离级别读取数据.一致性读取将忽略在读取视图中存在的记录上设置的任何锁定. (旧版本的记录无法锁定;它们通过在记录的内存副本上应用撤消日志来重建.)

尽管可能,但要保持交易简短.否则,您可以增加死锁的可能性.

更新2014-02-13 21:57美国东部时间

All locks set by LOCK IN SHARE MODE and FOR UPDATE queries are released when the transaction is committed or rolled back.

因此,如果在事务内执行SELECT … LOCK IN SHARE MODE,则行保持锁定状态,直到事务提交或回滚.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值