【问题标题】:transactional sqlite? in C#事务性sqlite?在 C# 中
【发布时间】:2010-01-20 09:11:51
【问题描述】:

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

【问题讨论】:

    标签: c# sqlite


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      SQLite.org 说:

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

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

      【讨论】:

      • 是的,SQLLite 确实强迫您使用“事务性”查询,而不是一个一个发送它们的坏习惯。
      猜你喜欢
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      相关资源
      最近更新 更多