开发环境 IDE:VS 2005 DB:Sqlite
程序主要结构如下:有一个Windows Service 分为3部分
1,有一个每隔20分钟执行的函数f1 这里面采用多线程处理方式,对DB有update,insert,delete等动作
2,一天内4个固定时间 执行的函数f2 设置为在每天的固定时间 进行处理 对DB有update动作
3,每天只执行一次的函数 f3 对DB有update动作
现在程序在运行的时候 大部分时候都没有异常,但是有时候(比如每2天)会发生一次如下的错误
polling - SQLiteException in 'updateDetail'. Error info is The database file is locked
database is locked
ERROR polling - SQLiteException in 'updateDetail'. Error info is   System.Data.SQLite.SQLite3.Step(SQLiteStatement stmt)
    System.Data.SQLite.SQLiteDataReader.NextResult()
    System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave)
    System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior)
    System.Data.SQLite.SQLiteCommand.ExecuteNonQuery()
    updateDetail(String XXX, String AAA, String BBB, String www, SQLiteConnection ccc)  
经过调查觉得是由于Sqlite对并发支持的不太好引起的,也许更换为Oracle等的话就不会发生这个问题,但是现在是不可以更换DB的。在仔细一些说的话 是由于当f1在update DB的时候,f2恰巧也在执行,也试图去更新DB 这时候DB已经被Lock了,无法更新因此会抛出这个错误,现在想通过程序来解决这个问题该怎么做呢?

解决方案 »

  1.   

    在程序线程代码里加锁(Lock),可以避免并发
      

  2.   

    既然是Windows Service,那就执行执行数据库操作,没必要同时执行又加锁限制。
      

  3.   

    既然是Windows Service,那就依次执行数据库操作,没必要同时执行又加锁限制。
      

  4.   

    锁并不是程序加的,而是sqlite加的,当有一个Thread 更新DB的时候 就会加锁。
      

  5.   

    我也有同样的情况。
    多个线程对数据库进行操作,主要是更新,mysql的同步支持好像也不行。
    但总体来说影响不大。加锁主要是加在哪里的问题。
    对数据库中加锁,对程序代码加锁,还是数据库的自带锁。
      

  6.   

    加锁会出现一个问题吧,多个线程本来就并发在执行,压力非常大,如果又在对数据库进行加锁操作,
    很多线程的话,等真正执行那条sql语句,或许会等很久,搞不好就造成了线程的死亡。