我有一个应用程序,我使用VS2008的Sql Compact 3.5。我正在我的应用程序中运行多个线程,它与压缩数据库联系并访问该行。它以一种方式选择和删除这些行,即选择并向应用程序提供5行并从表中删除这些行。它适用于单个线程,但如果我使用多个线程,即如果3个或更多线程正在运行,我经常会遇到TimeOut错误!我已经增加了连接字符串中的超时属性,但它没有给我预期的结果。错误日志如下:
SQL Server Compact超时等待锁定。设备的默认锁定时间为2000毫秒,桌面的默认锁定时间为5000毫秒。可以使用ssce:default lock timeout属性在连接字符串中增加默认锁定超时。 [Session id = 5,Thread id = 4204,Process id = 4808,Table name = XXX,Conflict type = x lock(s blocks),Resource = TAB]
我用来检索的查询如下:
” 从TableName按ID选择Top(5)*; 从TableName中删除其中的id(从表中按表ID从表中选择top(5)id); “
有什么方法可以避免这种超时异常???????
以上查询我在VS2008中作为事务使用SQLCECommand而另一个使用SqlCEDataAdapter。
任何想法!!!!!! 回复
答案 0 :(得分:2)
我遇到了完全相同的问题。我知道这是一个老问题但是对于任何人谷歌搜索答案我通过在我的dataReader上调用Reader.Close()来修复它。
该应用程序是单线程的,但如果我太快地提出太多请求,我会一直得到这个。
我希望有所帮助!
答案 1 :(得分:1)
您可以尝试一些连接字符串设置,例如“默认锁定超时”等。
请参阅SqlCeConnection.ConnectionString Property上的http://msdn.microsoft.com/en-us/library/system.data.sqlserverce.sqlceconnection.connectionstring(VS.80).aspx。
(除了用分号链接查询之外我什么都没有。)
答案 2 :(得分:0)
我正在使用默认锁定超时属性,但似乎没有反应或什么。它仍然给我相同的错误,我保持它的值为10000.查询等到那个时间,它发现直到表忙,因此它给出了异常。有没有办法让我们只锁定hte行而不是表??????
答案 3 :(得分:0)
我刚才遇到同样的问题......
问题是我在事务中完成了ALTER
表,然后尝试在同一事务中稍后从该表读取。哎呀。从事务中删除了ALTER
表,一切都很好。
答案 4 :(得分:0)
尽管可以使用SQLCE进行多线程处理,但数据库非常仅限于并发事务。
封装所有在使用语句中实现IDisposable的SQLCE相关类绝对是一个好主意,但根据负载的不同,仍然可能发生锁定错误。
似乎没有连接字符串超时选项都能解决。 作为解决方法,我只是在发生锁定错误时重试该操作。
请注意,大型SQL服务器不会因此受到影响。并行处理没有任何问题。