在最近的一个程序中,使用的是sqlite数据库。涉及到多线程对数据库的读写。因为sqlite本身有五个锁状态:unlocked,shared,reserved,pending,exclusive。每个事务都必须获得相应的锁才可以进行读写操作,所以一开始我自己的程序中是没有加任何锁的。具体sqlite的各种锁状态的知识百度一下就会很多很多。
我的源代码时使用golang编写的,使用了第三方的sqlite包github.com/mattn/go-sqlite3,但是并没有导入这个包,只是import _"github.com/mattn/go-sqlite3",调用了包里的初始化函数,实现了database/sql包里的相关接口,具体对于数据库的操作还是使用的是sql包中的DB对象进行操作。
但是当代码跑起来的时候,在进行写数据库操作的时候却报了这样的一个错:error:database is locked。上网查了一下当事务进行并发写操作的时候,是有可能产生死锁的,一开始还以为是死锁造成的,就在代码中在应用层对所有的事务都加了锁,但是令人崩溃的是依旧报错。
到最后我索性把数据库所有的读写操作全部改成串行,但是令人难以置信的是,,,依然报错。
最后在stackoverflow上看到一个回答:https://stackoverflow.com/questions/32479071/sqlite3-error-database-is-locked-in-golang
尝试一下调用rows.Close()
意思就是,当golang对关系型数据