使用 uwsgi 起多进程每个进程是单线程会不会使数据库出现重复数据?如果不会的话,每个进程是多线程时会不会使数据库出现重复数据?麻烦说一下原因。
1
loading 2016-07-26 19:35:57 +08:00 via Android
关键字:数据库锁机制
|
3
loading 2016-07-26 19:41:28 +08:00 via Android
重复数据无论是否多线程都会出现的,很多都要程序配合数据库锁处理,例如注册时检查是否已存在用户名就是你说的问题啦。
|
4
loading 2016-07-26 19:43:10 +08:00 via Android
如果无法实时处理,很多场景都会设置定时任务,进行数据库的自动程序化维护。
|
5
loading 2016-07-26 19:46:25 +08:00 via Android
设计表时,可以加入其他列,例如进行提交的用户名,和插入时间,其中这个时间使用 sql 函数,这样你就能做到数据都不同了,便于后面自动去重。
还有自增 id 等方式 |
7
ziXiong 2016-07-26 21:55:53 +08:00
重复数据与 uwsgi 是多进程模式还是多线程模式都没有关系。 uwsgi 多进程相当于把 http 负载到了不同的 worker 。
重复数据是在编程时通过代码检查和数据库加锁,唯一索引等限制的。 |
8
izoabr 2016-07-26 22:04:58 +08:00
事务、锁
|
9
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 |