我正在写一个原型应用程序.现在有些事情失败了,比如插入一个非唯一的列.在这种情况下,我想回滚我所做的一切.我怎么做?我还注意到在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命令不会获得数据库上的任何锁。在执行BEGIN命令之后,将在执行第一个SELECT语句时获取SHARED锁定。当执行第一个INSERT,UPDATE或DELETE语句时,将获得RESERVED锁。直到内存高速缓存已满并且必须溢出到磁盘或事务提交之前,才会获得EXCLUSIVE锁定。这样,系统将阻止对文件文件的读取访问延迟到最后一个可能的时刻。