1. 看一下MySQL事务隔离性相关的东西你应该能找到答案。 2. InnoDB是行锁,如果在不同的事务中修改同一行数据,则第二个Update会卡在那里,直到第一个加锁处理(Update 或者 SELECT xxx FOR UPDATE )的事务提交或回滚。
1、select num where id=1 后面要加上 for update 2、你在更新它值的时候,要把看到的旧值50元当做参数来判断 更新时应该类似这样的事务: start transaction select X_VALUE from where id=xxx for update IF X_VALUE<>50 ROLLBACK return 值已变化,出错返回 ENDIF UPDATE SET X_VALUE=X_VALUE+50 WHERE ID=XXX COMMIT
嗯楼上的回答准确一些 SELECT xxx FOR UPDATE 是精髓啊。。
1 不会,没有commit这行就一直加着排他锁 2 你需要一个select for update语句锁定这一行 然后更新
2. InnoDB是行锁,如果在不同的事务中修改同一行数据,则第二个Update会卡在那里,直到第一个加锁处理(Update 或者 SELECT xxx FOR UPDATE )的事务提交或回滚。
1、select num where id=1 后面要加上 for update
2、你在更新它值的时候,要把看到的旧值50元当做参数来判断
更新时应该类似这样的事务:
start transaction
select X_VALUE from where id=xxx for update
IF X_VALUE<>50
ROLLBACK
return
值已变化,出错返回
ENDIF
UPDATE SET X_VALUE=X_VALUE+50 WHERE ID=XXX
COMMIT
SELECT xxx FOR UPDATE 是精髓啊。。
不会,没有commit这行就一直加着排他锁
2
你需要一个select for update语句锁定这一行 然后更新