SQLAlchemy的问题

在青传使用flask开发的过程中,为了更好的配合MVC架构,也为了使得我们的架构,代码更规范和优雅,我引入了ORM框架--SQLAlchemy,但是在团队使用SQLAlchemy的过程中,还是发现了问题,同时也由于该ORM框架,发生了多起比较难以解决的问题,现在我将来解释今天因为该框架发生的一个问题。

 

今天下午原同学在网站运行的时候,直接进入数据库执行alter操作,结果未来网未来网访问的时候无响应,浏览器空等服务器响应,而数据库的alter操作也未能执行,卡在命令行中,直到强制结束mysql命令才恢复正常,这是为什么呢?

 

是因为死锁。

 

为什么会有锁?锁在哪里?死锁是如何产生的?

 

你需要明白以下几点:

1.SQLAlchemy框架在运行的时候,为了将数据库冷冰冰的表与字段,与对象及其属性关联起来,是做了代码级别的映射的,

2.代码一旦运行起来了,就不可能动态地更改映射关系,除非停掉程序修改代码然后再运行

3.SQLAlchemy是常驻后台的,只有这样才能实现数据库连接池

 

当网站启动,SQLAlchemy后台常驻,映射开始的时候,SQLAlchemy是一定会在数据库上加锁的,如果不加锁,操作者修改了数据库,如删除了某字段,但是正在运行的sqlalchemy误以为该字段仍然存在,就会依旧执行与该字段有关的sql操作,导致出错,程序崩溃。运行时的出错造成的危害是很严重的,这就是锁存在的原因。

 

糟糕的是,sqlalchemy加的锁似乎不是一个互斥锁,而是一个有点像竞态锁的东西,导致执行alter语句不是直接被锁拒绝,而是参与了与sqlalchemy竞态,导致死锁的发生。

 

Sqlalchemy算是一个比较老的项目,但是在使用的过程中,我也遇见了很多棘手的问题,大多数是sqlalchemy本身设计上的问题。ORM这种东西本身是没有错的,错的是sqlalchemy当初设计上的失误。



关于我们

青传技术中心是武汉大学青年传媒集团领导下的技术部门,负责青传技术平台的构建,开发与维护


下属部门

  • 设计部
  • 前端部
  • 后端部

核心开发团队

姓名:叶泽韬

领域:Python PHP

院系:国软

部门:后端部

姓名:徐游荧

领域:前端 Java

院系:国软

部门:前端部

姓名:原致远

领域:Python JS

院系:计科

部门:后端部

姓名:邓露艺

领域:Python C++

院系:电信

部门:后端部