【发布时间】:2010-01-20 09:11:51
【问题描述】:
我正在编写一个原型应用程序。现在有些事情失败了,比如插入一个非唯一的列。在这种情况下,我想回滚我所做的一切。我怎么做? 我还注意到在 sqlite 中我需要提交数据,在 C# 中它似乎是自动完成的,这让我怀疑有一个自动回滚选项?
【问题讨论】:
我正在编写一个原型应用程序。现在有些事情失败了,比如插入一个非唯一的列。在这种情况下,我想回滚我所做的一切。我怎么做? 我还注意到在 sqlite 中我需要提交数据,在 C# 中它似乎是自动完成的,这让我怀疑有一个自动回滚选项?
【问题讨论】:
回滚:看起来您正在寻找的是命令文本“INSERT OR ROLLBACK ...”
事务:sqlite 自动将每个命令放入自己的事务中,除非您明确说明何时开始。 编辑:TML 在他的回答中更深入地解释了这部分
显式打开/提交事务的示例是:
using (DbTransaction dbTrans = myDBConnection.BeginTransaction())
{
using (DbCommand cmd = myDBConnection.CreateCommand())
{
...
}
dbTrans.Commit();
}
【讨论】:
SQLite.org 说:
锁定和并发的变化 SQLite 版本 3 中的控制也 引入一些细微的变化 事务在 SQL 中的工作方式 语言水平。默认情况下,SQLite 版本 3 在自动提交模式下运行。 在自动提交模式下,对 数据库尽快提交 与当前相关的操作 数据库连接完成。
SQL 命令“BEGIN TRANSACTION” (TRANSACTION 关键字是可选的) 用于取出 SQLite 自动提交模式。请注意,开始 命令不获取任何锁定 数据库。在 BEGIN 命令之后,一个 SHARED 锁将在 执行第一个 SELECT 语句。一个 RESERVED 锁将在 第一个 INSERT、UPDATE 或 DELETE 语句被执行。没有独家 锁定被获取,直到任一 内存缓存已满,必须 溢出到磁盘或直到 事务提交。这样, 系统延迟阻止读取访问 文件文件直到最后可能 时刻。
【讨论】: