几个线程同时进行事务并发的问题。。

one_chord 2012-07-02 07:03:34

几个线程同时进行事务A。。

如果事务A里面有一个步骤1:是对某一个表某条固定记录进行更新操作的。。

问题1:那是不是表行会被锁住,线程之间后一个必须等前一个提交事务才继续(“运行”还是“提交事务”)?

事务A有一个步骤2:是对某个表进行INSERT记录的;
事务A提交前还有一个步骤3:是比较步骤2的数据,如果出现INSERT的记录超过要求,就回滚。。

问题2:如果问题1的答案是提交事务,如果发生并发,步骤3这一步是不是没用了,检测不了?如果答案是运行,那可以防并发吗?

问题3:如果问题2解决不了,是不是一定要在步骤2 INSERT记录前进行这个表的SELECT FOR UPDATE进行行锁?这应该可以解决并发了吧,有没人其它办法呀。

希望有前辈指导一下,谢谢。。。



...全文
4182 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
one_chord 2012-07-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
引用 2 楼 的回复:
如果1,2不是原子的,那么查询A和更新A中间会有其他操作修改A,怎么办?
[/Quote]
不对,你提的到的“其它操作”不是指这个事务内的吧。我的例子里其它的操作不用考虑,因为只有这个事务才会进行相应影响的操作。

说到这里,再回头看一下我的步骤1和问题1,好像不会发生并发了,因为步骤1已经锁住了,只有该事务提交了才会运行下一个步骤1,这样步骤2和3就不会被影响到,一个事务一个事务运行。。。

越想越乱。。唉。。。
one_chord 2012-07-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
如果1,2不是原子的,那么查询A和更新A中间会有其他操作修改A,怎么办?
[/Quote]

我这样理解有没有问题:
例如有两个线程 A和B
线程A判断条件满足了,进行了INSERT的操作,但事务还没提交。
这个时候线程B拿到的数据还没有A INSERT的数据,所以也满足了条件
当线程A提交以后,B再提交 导致并发的情况
所以一定要锁住判断的条件。。
kyzy_yy_pm 2012-07-03
  • 打赏
  • 举报
回复
线程之间后一个必须等前一个提交事务才继续(“运行”还是“提交事务”)

不然的话,前一个还没运行完后一个就运行那么可能导致数据的错误,例如:前一个将数据更新成2,这个时候后一个将数据将该数据从原来的基础上+1,那么到时候后一个提交的时候就依然是2
one_chord 2012-07-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
[/Quote]

上边都不说了,这个问题是关键。 一定要for update锁住,你完全可以认为for update就是lock加锁,只有这样才能保证原子性,否则一个这样的事务真心没法原子性:
原子性:一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。
我一直以为事务本身就有这种功能,而不是要去构造这样的环境

如果1,2不是原子的,那么查询A和更新A中间会有其他操作修改A,怎么办?把1,2整体锁住就行了
我有点明白了,这个是保证 隔离性?谢谢你
one_chord 2012-07-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
事务的特征:
离开了这个原则,就没有讨论的必要了
[/Quote]
简结明了。。希望有详细一点的分析,呵呵。
qq120848369 2012-07-02
  • 打赏
  • 举报
回复
问题3:如果问题2解决不了,是不是一定要在步骤2 INSERT记录前进行这个表的SELECT FOR UPDATE进行行锁?这应该可以解决并发了吧,有没人其它办法呀。

上边都不说了,这个问题是关键。 一定要for update锁住,你完全可以认为for update就是lock加锁,只有这样才能保证原子性,否则一个这样的事务真心没法原子性:

1,查询A
2,A满足条件则更新A

如果1,2不是原子的,那么查询A和更新A中间会有其他操作修改A,怎么办?把1,2整体锁住就行了,for update是一种办法,尤其是innodb可以行锁,所以比直接lock table好用。
xuzuning 2012-07-02
  • 打赏
  • 举报
回复
事务的特征:
Atomicity(原子性)
Consistency(稳定性,一致性)
Isolation(隔离性)
Durability(可靠性)

离开了这个原则,就没有讨论的必要了

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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