uwsgi 多进程会不会使数据库出现重复数据?

2016-07-26 19:22:23 +08:00
 myyou

使用 uwsgi 起多进程每个进程是单线程会不会使数据库出现重复数据?如果不会的话,每个进程是多线程时会不会使数据库出现重复数据?麻烦说一下原因。

4920 次点击
所在节点    Python
9 条回复
loading
2016-07-26 19:35:57 +08:00
关键字:数据库锁机制
myyou
2016-07-26 19:41:16 +08:00
@loading 假设来自两个进程的重复数据,一条数据插入数据库后,另一条数据等待数据库解锁后不是也可以继续插入吗?
loading
2016-07-26 19:41:28 +08:00
重复数据无论是否多线程都会出现的,很多都要程序配合数据库锁处理,例如注册时检查是否已存在用户名就是你说的问题啦。
loading
2016-07-26 19:43:10 +08:00
如果无法实时处理,很多场景都会设置定时任务,进行数据库的自动程序化维护。
loading
2016-07-26 19:46:25 +08:00
设计表时,可以加入其他列,例如进行提交的用户名,和插入时间,其中这个时间使用 sql 函数,这样你就能做到数据都不同了,便于后面自动去重。

还有自增 id 等方式
ryd994
2016-07-26 20:48:41 +08:00
@myyou unique 索引,或者用锁:
加锁
检查有没有重复项
写入
取锁

其他进程在检查和写入之间不可能插队
ziXiong
2016-07-26 21:55:53 +08:00
重复数据与 uwsgi 是多进程模式还是多线程模式都没有关系。 uwsgi 多进程相当于把 http 负载到了不同的 worker 。
重复数据是在编程时通过代码检查和数据库加锁,唯一索引等限制的。
izoabr
2016-07-26 22:04:58 +08:00
事务、锁
Carrycat
2016-08-10 14:43:44 +08:00
会的 最简单的体验方法就是 在 gunicorn or wsgi 的 multi workers 情况下连续 POST or Put 相同的 api 就发现了。原因是 django default 是 autocommit=true
你必须在关键写入地方使用

with transaction.atomic(): # django >= 1.9
#or install django-transaction-hooks if django < 1.9 这个插件可以 lock table row not whole table
https://github.com/carljm/django-transaction-hooks

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/295099

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX