2008年9月25日星期四

[pitfall]python初始化数据库Connection时会关闭autocommit

[pitfall]python初始化数据库Connection时会关闭autocommit

之前用Django的model来存取数据库的数据,没有异常。现在要拆分数据库,因为Django不支持multiple database,所以使用了数据库直连的方法来解决,以前用到model的地方都要改为sql语句来实现。

上线后,跟踪系统日志,没有发现代码抛出任何异常。但是第二天发现报表有些数据不太正常。数据库的不少记录没有成功update。debug后发现是改成sql语句后导致部分涉及innodb表的写操作全部没有提交。

怀疑是数据库设置有问题,slelct @@autocommit;没有问题,是1。

一步一步调试,发现在MySQLdb初始化connection的时候,有这样的代码:

if self._transactional:
# PEP-249 requires autocommit to be initially off
self.autocommit(False)

原来是MySQLdb在搞鬼。不对啊,它为什么这么做呢?看它的注释:

# PEP-249 requires autocommit to be initially off

原来Python Database API Specification v2.0里面做了这样的规范:

.commit()

Commit any pending transaction to the database. Note that if the database supports an auto-commit feature, this must be initially off. An interface method may be provided to turn it back on.

Database modules that do not support transactions should implement this method with void functionality.

在在MySQLdb的FAQ里面也有说明。

教训:要多看文档,不能臆断其有无啊。

2008年9月6日星期六

推荐一个学英语的网站

今天在土豆上面无意中找到一个教英语的视频,看了一下效果很好。

这个网站是: 秧教英语

有兴趣的可以去看一下。

2008年9月3日星期三

什么是最好的技术积累?

什么是最好的技术积累?

一个人要向前发展,需要厚积薄发,从之前的错误和经历中汲取经验。一家公司想从优秀到卓越,需要做的努力比个人要多得多。

每一个好的公司都需要技术积累,特别是做IT的公司,没有一定的技术沉淀很难做大做强。

如果没有技术积累会怎样?听说过不少这样的例子,相同的错误反复在不同部门,不同时间出现;重复功能的代码写了一遍又一遍;历史代码难以维护......你可能遇到的更多。

怎么办?

极限编程,测试案例,文档,wiki,trac,培训......有很多解决沟通和分享的方案可以列出来。

我觉得这些确实可以解决表面的问题。但我觉得这些都是治标不治本的。

如果一个公司平均在职时间比较短,人员流动过于频繁,那么就算上面的所有方法你都实施了,效果也不会明显。

积累,是用积累起来的技术解决新问题,而不是针对新问题重新开始再一次的积累。所以对于公司来说,最好的技术积累就是留住人才;对于研发团队来讲,最好的技术积累是代码高度重用;对于个人来讲,最好的技术积累是能自己参与完成一个大的项目。