我在SQLite数据库中使用了Dapper。我开发了一些多线程代码,其中每个线程都使用Dapper ORM执行一些读取和写入操作。这两个线程也可能会尝试同时在同一张表上进行写入。
我面临的困惑是我是否必须在代码中实现某种技术以使并发读取线程安全,还是由dapper替我处理。
请注意,我很熟悉SQLite是锁定db文件以进行写入的对象,而我唯一关心的就是Dapper及其在这种情况下的功能。
答案 0 :(得分:1)
正如您所说,SQLite在数据库文件级别实现锁定。
Dapper或任何其他完整或微型ORM不能更改此事实。任何ORM都不会为任何RDBMS实现线程管理或并发。线程管理是用户的责任。
换种方式。 ORM如何知道如何实现线程化?
是;一些ORM将连接管理到一定级别。但大多数情况下,它仅限于创建/打开/处置它。 ORM不控制线程或并发。它是由用户实现的。
回复您的评论:
但是,问题仍然存在,在这种情况下dapper会执行什么操作,因为它可能具有某种重试逻辑,以防万一锁存在时再次尝试执行查询。
Dapper不会那样做。 Dapper的工作方式与ADO.NET完全一样(很好。对于任何查询部分,Dapper的功能都与ADO.NET没什么不同。
因此,为回答您的评论,如果某些ADO.NET提供程序实现重试逻辑,则Dapper将自动继承它。但是,Dapper本身并没有实现任何此类逻辑。
如果我猜对了,ADO.NET将抛出适当的异常-Dapper只会将该异常传递给您。
希望this的答案对您有所帮助。