
1 geek123 2016 年 5 月 12 日 |
2 iiduce 2016 年 5 月 12 日 Django 真没什么可带的,官方文档写的太好太详细,看一遍,写个博客程序,就入门了。 剩下的的就是了解你需要的各种中间件、插件的使用,用哪个学哪个,基本都是看官方文档就可以了。 |
5 sudo987 OP @iiduce 请问 F()解决 race condition 是怎么个原理,官方教程说的是在 save 之前总会用的是数据库的值而不是本地取下来的值,看源码也没太看明白。 |
6 virusdefender 2016 年 5 月 12 日 via Android @sudo987 save 会更新所有字段,这时候数据库可能已经变了,看 https://virusdefender.net/index.php/archives/276/ |
7 sudo987 OP @virusdefender UPDATE `account_user` SET `age` = (`account_user`.`age` - 100) WHERE `account_user`.`id` = 8000 问题在这儿, F 完成的是更新数据之前总会取数据库最新的值,但是如果在 account_user.user 获取之后数据库发生改变,那岂不是又发生 race condition 了么? |
8 neoblackcap 2016 年 5 月 12 日 @sudo987 你看到是这样,但是底层的 InnoDB 引擎已经将你要修改的 row 隐式加了锁了,自然就解决了 data race 了 |
9 sudo987 OP @neoblackcap 给力!在哪里可以看见代码? |
10 neoblackcap 2016 年 5 月 12 日 @sudo987 你看 MySQL 的文档就知道了,而且 @virusdefender 的文章不是说了吗?是当你选中主键的时候才会是这样,而且要加事务。 我是不建议大家写这样的代码,要加锁的话就显式加上就好了,维护者会更加明确。毕竟这样的隐式加锁依赖于数据库的实现,不同数据库有不同的表现,不同存储引擎也有不同的表现。 |
11 sudo987 OP @neoblackcap 谢谢。 |