mysql没有oracle的for update吗?

roypayne0305 2013-11-18 11:04:46
以前用oracle PL/SQL改数据,查询+forupdate就可以修改数据,很方便。

mysql不行,纠结~~各位大神怎么看?
...全文
566 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
roypayne0305 2013-11-22
  • 打赏
  • 举报
回复
引用 15 楼 trainee 的回复:
你的修改,应该是工具带来的便利, 而和select * ...for update没关系. 我经常用的EMS for mysql,select的数据也可以修改。
恩,最好有那种 多表关联,查询具体列的,也能修改。
iihero 2013-11-21
  • 打赏
  • 举报
回复
命令行下执行是最保险的,楼主再试一下。
ACMAIN_CHM 2013-11-21
  • 打赏
  • 举报
回复
这不是MYSQL本身的问题了。是navicat的问题了。 对MYSQL来说,最终都只是执行SQL语句而已。 建议先在MYSQL本身的命令行工具下测试。 而非MYSQL官方提供的工具,MYSQL本身并不提供保证。
roypayne0305 2013-11-21
  • 打赏
  • 举报
回复
引用 11 楼 iihero 的回复:
[quote=引用 10 楼 roypayne0305 的回复:] [quote=引用 8 楼 ACMAIN_CHM 的回复:] 楼主的ORALCE中的FOR UPDATE是指什么? MYSQL本身是有 select * from xx for update
例如我用navicat,我改一条数据。 1) select * from table where id=222 这个可以直接在显示的行中修改数据。 2) select t.realname,t.address from table t where t.id =222 这个是修改不了的,如果是oracle +for update 是可以修改数据的。 [/quote] 请看我在7楼的回帖,前边要加begin的。 否则for update会失去作用。这是与oracle的区别。[/quote] select * 不用加for update也能修改。 select t.realname,t.address from table t where t.id =222 这种是不行的。
trainee 2013-11-21
  • 打赏
  • 举报
回复
你的修改,应该是工具带来的便利, 而和select * ...for update没关系. 我经常用的EMS for mysql,select的数据也可以修改。
iihero 2013-11-20
  • 打赏
  • 举报
回复
引用 10 楼 roypayne0305 的回复:
[quote=引用 8 楼 ACMAIN_CHM 的回复:] 楼主的ORALCE中的FOR UPDATE是指什么? MYSQL本身是有 select * from xx for update
例如我用navicat,我改一条数据。 1) select * from table where id=222 这个可以直接在显示的行中修改数据。 2) select t.realname,t.address from table t where t.id =222 这个是修改不了的,如果是oracle +for update 是可以修改数据的。 [/quote] 请看我在7楼的回帖,前边要加begin的。 否则for update会失去作用。这是与oracle的区别。
sjqzone 2013-11-19
  • 打赏
  • 举报
回复
select from ue_order where id = 1 for update;
ACMAIN_CHM 2013-11-19
  • 打赏
  • 举报
回复
楼主的ORALCE中的FOR UPDATE是指什么? MYSQL本身是有 select * from xx for update
iihero 2013-11-19
  • 打赏
  • 举报
回复
为何都认为mysql没有此功能? select **** for update, 要结合transaction来使用的。 假定使用的是InnoDB引擎,默认是读已提交隔离级, 会话1:
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t for update;
+----+------+
| id | col2 |
+----+------+
|  1 | wa   |
|  2 | ch   |
+----+------+
2 rows in set (0.00 sec)

mysql>
会话2:
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update t set col2='ww' where id=1;
update操作会hang在那里,与需求相符。直到出现:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 这时如果会话1,执行commit操作, 会话2的update操作立即完成。
roypayne0305 2013-11-19
  • 打赏
  • 举报
回复
引用 8 楼 ACMAIN_CHM 的回复:
楼主的ORALCE中的FOR UPDATE是指什么? MYSQL本身是有 select * from xx for update
例如我用navicat,我改一条数据。 1) select * from table where id=222 这个可以直接在显示的行中修改数据。 2) select t.realname,t.address from table t where t.id =222 这个是修改不了的,如果是oracle +for update 是可以修改数据的。
Rotel-刘志东 2013-11-19
  • 打赏
  • 举报
回复
mysql暂时版本是没有此功能的。
东东堂 2013-11-18
  • 打赏
  • 举报
回复
mysql> select * from a for update; +------+ | a | +------+ | 10 | | 20 | | 30 | | 10 | | 10 | +------+ 5 rows in set (0.00 sec) 版本是Server version: 5.6.14 MySQL Community Server (GPL)。 innodb engine.
rucypli 2013-11-18
  • 打赏
  • 举报
回复
mysql暂时没这功能
iihero 2013-11-18
  • 打赏
  • 举报
回复
或者你可能需要用lock tables语法,如果使用MyISAM引擎的话。
iihero 2013-11-18
  • 打赏
  • 举报
回复
mysql中使用innodb引擎即可, 详见文档: If you use FOR UPDATE on a storage engine that uses page or row locks, rows examined by the query are write-locked until the end of the current transaction. Using LOCK IN SHARE MODE sets a shared lock that prevents other transactions from updating or deleting the examined rows
加密解码 2013-11-18
  • 打赏
  • 举报
回复
mysql怎么不行了。。。 毕竟一个开源,一个收费

56,912

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧