根据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,则行保持锁定状态,直到事务提交或回滚.