事务性sqlite?在C#中

时间:2009-05-28 23:39:18

标签: c# sqlite

我正在编写原型应用程序。现在有些事情失败了,比如插入一个非唯一的列。在这种情况下,我想回滚我所做的一切。我怎么做? 我还注意到在sqlite中我需要提交数据,在C#中它似乎是自动执行的,这让我怀疑是否有自动回滚选项?

2 个答案:

答案 0 :(得分:13)

回滚:看起来你正在寻找的是命令文本“INSERT OR ROLLBACK ...”

事务:除非您具体说明何时开始,否则sqlite会自动将每个命令放入其自己的事务中。 编辑:TML在他的回答中更深入地解释了这一部分

显式打开/提交事务的示例是:

using (DbTransaction dbTrans = myDBConnection.BeginTransaction())
{
     using (DbCommand cmd = myDBConnection.CreateCommand())
     {
         ...
     }
     dbTrans.Commit();
}

答案 1 :(得分:5)

SQLite.org说:

  

对锁定和并发的更改   在SQLite版本3中也可以控制   介绍一些微妙的变化   方式事务在SQL上工作   语言水平。默认情况下,SQLite   版本3以自动提交模式运行。   在自动提交模式下,所有更改   数据库尽快提交   与当前相关的操作   数据库连接完成。

     

SQL命令“BEGIN TRANSACTION”   (TRANSACTION关键字是可选的)   用来取出SQLite   自动提交模式。注意BEGIN   命令不会获取任何锁定   数据库。在BEGIN命令之后,a   当获得SHARED锁时   执行第一个SELECT语句。一个   保留锁定时将获得   第一个INSERT,UPDATE或DELETE   声明被执行。没有独家   锁定被获得,直到   内存缓存填满,必须   溢出到磁盘或直到   交易提交。就这样,   系统延迟阻止读访问   文件文件,直到最后一次可能   时刻。