SQLite3 数据库被锁定在 Azure 中

问题描述 投票:0回答:6

我有一个运行在 Azure 上的 Flask 服务器,由 Azure 应用服务提供,并使用 sqlite3 作为数据库。我无法更新 sqlite3,因为它显示数据库已锁定

    2018-11-09T13:21:53.854367947Z [2018-11-09 13:21:53,835] ERROR in app: Exception on /borrow [POST]
    2018-11-09T13:21:53.854407246Z Traceback (most recent call last):
    2018-11-09T13:21:53.854413046Z   File "/home/site/wwwroot/antenv/lib/python3.7/site-packages/flask/app.py", line 2292, in wsgi_app
    2018-11-09T13:21:53.854417846Z     response = self.full_dispatch_request()
    2018-11-09T13:21:53.854422246Z   File "/home/site/wwwroot/antenv/lib/python3.7/site-packages/flask/app.py", line 1815, in full_dispatch_request
    2018-11-09T13:21:53.854427146Z     rv = self.handle_user_exception(e)
    2018-11-09T13:21:53.854431646Z   File "/home/site/wwwroot/antenv/lib/python3.7/site-packages/flask/app.py", line 1718, in handle_user_exception
    2018-11-09T13:21:53.854436146Z     reraise(exc_type, exc_value, tb)
    2018-11-09T13:21:53.854440346Z   File "/home/site/wwwroot/antenv/lib/python3.7/site-packages/flask/_compat.py", line 35, in reraise
    2018-11-09T13:21:53.854444746Z     raise value
    2018-11-09T13:21:53.854448846Z   File "/home/site/wwwroot/antenv/lib/python3.7/site-packages/flask/app.py", line 1813, in full_dispatch_request
    2018-11-09T13:21:53.854453246Z     rv = self.dispatch_request()
    2018-11-09T13:21:53.854457546Z   File "/home/site/wwwroot/antenv/lib/python3.7/site-packages/flask/app.py", line 1799, in dispatch_request
    2018-11-09T13:21:53.854461846Z     return self.view_functions[rule.endpoint](**req.view_args)
    2018-11-09T13:21:53.854466046Z   File "/home/site/wwwroot/application.py", line 282, in borrow
    2018-11-09T13:21:53.854480146Z     cursor.execute("UPDATE books SET stock = stock - 1 WHERE bookid = ?",(bookid,))
    2018-11-09T13:21:53.854963942Z sqlite3.OperationalError: database is locked

这是路线 -

@app.route('/borrow',methods=["POST"])
def borrow():
    # import pdb; pdb.set_trace()
    body = request.get_json()
    user_id = body["userid"]
    bookid = body["bookid"]
    conn = sqlite3.connect("database.db")
    cursor = conn.cursor()
    date = datetime.now()
    expiry_date = date + timedelta(days=30)
    cursor.execute("UPDATE books SET stock = stock - 1 WHERE bookid = ?",(bookid,))
    # conn.commit()
    cursor.execute("INSERT INTO borrowed (issuedate,returndate,memberid,bookid) VALUES (?,?,?,?)",("xxx","xxx",user_id,bookid,))
    conn.commit()
    cursor.close()
    conn.close()

    return json.dumps({"status":200,"conn":"working with datess update"})

我尝试使用编译指示检查数据库完整性。没有完整性损失。所以我不知道什么可能导致该错误。感谢任何帮助:)

sql azure sqlite
6个回答
11
投票

我在 Linux 上的 Docker 上使用 Azure 应用服务,也遇到了同样的问题。如果您在 Windows 上使用 Azure 应用服务,问题与我的不同。

问题在于 /home 挂载为 CIFS 文件系统,无法处理 SQLite3 锁定。

我的解决方法是将 db.sqlite3 文件复制到 /home 以外的某个目录,并正确设置 db.sqlite3 文件及其目录的权限和所有权。然后,让我的项目读/写它。然而,这种解决方法非常尴尬。我不推荐。


9
投票

大概这个解决方案对于生产工作负载来说并不安全,但至少我通过执行以下命令让它工作:

sqlite3 <database-file> 'PRAGMA journal_mode=wal;'

运行上述命令后,存储在 Azure 文件共享上的数据库可以在容器 Web 应用程序中运行。


5
投票

我通过使用以下配置设置天蓝色安装选项来获得它:

dir_mode=0777,file_mode=0777,uid=0,gid=0,mfsymlinks,nobrl,cache=strict

但真正的解决方案是添加标志 nobrl(字节范围锁定)。

为 kubernetes 添加存储类示例:

---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: azureclass
provisioner: kubernetes.io/azure-file
mountOptions:
  - dir_mode=0777
  - file_mode=0777
  - uid=0
  - gid=0
  - mfsymlinks
  - nobrl
  - cache=strict
parameters:
  skuName: Standard_LRS

1
投票

这个答案出现在这个问题的典型谷歌搜索的顶部,所以我想我应该添加一些额外的提示:

对于那些运行 JavaScript 并使用 Sequelize 作为 SQLite 数据库接口的人,运行

await sequelize.query('PRAGMA journal_mode=WAL;')

在创建数据库之前,您可以在 Linux 服务计划下运行的 Azure Web 应用程序中读取/写入数据库文件。我有一个单独的脚本,通过调用

sequelize.sync()
创建一个脚本。我将 DB 文件存储在 Linux 容器文件系统中 /home 下的单独目录中。看起来运行良好,预计我的工作量会很轻。请注意,当您的应用程序启动并尝试连接到数据库时,您不需要再次设置日志模式,该模式将在文件本身中设置(这在 SQLite 文档中并不明显)。


0
投票

这个问题对我来说已经消失了。

sqlite3 v5.1.5

Azure Linux-开发(S1:1)

添加了 NodeJS Web 应用程序,所有内容均默认设置,主页仍挂载为 CIFS,可能更改的是模式 - 0777:

/home type cifs (rw,relatime,vers=3.1.1,cache=strict,username=secretuserid,uid=0,noforceuid,gid=0,noforcegid,addr=secretip,file_mode=0777,dir_mode=0777,soft,nounix,serverino,mapposix,nobrl,mfsymlinks,noperm,rsize=1048576,wsize=4194304,bsize=1048576,echo_interval=60,actimeo=1)

0
投票

我使用免费套餐 F1 来获取网络服务。升级到B1后问题就解决了。应用迁移后,我能够缩小到 F1。

© www.soinside.com 2019 - 2024. All rights reserved.