SQLite事务与自增深度分析
SQLite什么都好,就怕“database is locked”这些年来想尽办法去规避它。 static void Test2() { XCode.Setting.Current.TransactionDebug = true; XTrace.WriteLine(Role.Meta.Count + ""); XTrace.WriteLine(Log.Meta.Count + ""); Console.Clear(); Task.Run(() => TestTask(1)); Thread.Sleep(1000); Task.Run(() => TestTask(2)); } static void TestTask(Int32 tid) { try { XTrace.WriteLine("TestTask {0} Start",tid); using (var tran = Role.Meta.CreateTrans()) { var role = new Role(); role.Name = "R" + DateTime.Now.Millisecond; role.Save(); XTrace.WriteLine("role.ID={0}",role.ID); Thread.Sleep(3000); role = new Role(); role.Name = "R" + DateTime.Now.Millisecond; role.Save(); XTrace.WriteLine("role.ID={0}",role.ID); Thread.Sleep(3000); if (tid == 2) tran.Commit(); } } catch (Exception ex) { XTrace.WriteException(ex); } finally { XTrace.WriteLine("TestTask {0} End",tid); } }View Code 预热环境以后,我们开了两个任务去执行测试函数,间隔1秒。 比较好奇,任务1申请得到自增1后,任务2申请得到的自增会是多少? 02:45:03.470 6 Y 5 TestTask 1 Start 02:45:03.470 6 Y 5 Transaction.Begin ReadCommitted 02:45:03.486 6 Y 5 Select Count(*) From Role Where Name='R470' 02:45:03.501 6 Y 5 Insert Into Role(Name,IsSystem,Permission) Values('R470',0,'');Select last_insert_rowid() newid 02:45:03.517 6 Y 5 开始初始化实体类UserX 02:45:03.517 6 Y 5 完成初始化实体类UserX 02:45:03.533 6 Y 5 role.ID=11 02:45:04.486 14 Y 6 TestTask 2 Start 02:45:04.486 14 Y 6 Transaction.Begin ReadCommitted 02:45:04.486 14 Y 6 Select Count(*) From Role Where Name='R486' 02:45:04.486 14 Y 6 Insert Into Role(Name,Permission) Values('R486','');Select last_insert_rowid() newid 02:45:05.251 15 Y 7 Transaction.Begin ReadCommitted 02:45:05.251 15 Y 7 Insert Into Log(Category,[Action],LinkID,CreateUserID,CreateTime,Remark) Values('角色','添加',11,'2017-01-27 02:45:03','ID=11,Name=R470');Select last_insert_rowid() newid 02:45:06.548 6 Y 5 Select Count(*) From Role Where Name='R548' 02:45:06.548 6 Y 5 Insert Into Role(Name,Permission) Values('R548','');Select last_insert_rowid() newid 02:45:06.548 6 Y 5 role.ID=12 02:45:09.555 6 Y 5 Transaction.Rollback ReadCommitted 02:45:09.555 6 Y 5 TestTask 1 End 02:45:09.618 14 Y 6 SQL耗时较长,建议优化 5,120毫秒 Insert Into Role(Name,'');Select last_insert_rowid() newid 02:45:09.618 14 Y 6 role.ID=11 02:45:12.633 14 Y 6 Select Count(*) From Role Where Name='R633' 02:45:12.633 14 Y 6 Insert Into Role(Name,Permission) Values('R633','');Select last_insert_rowid() newid 02:45:12.633 14 Y 6 role.ID=12 02:45:15.649 14 Y 6 Transaction.Commit ReadCommitted 02:45:15.649 14 Y 6 TestTask 2 End 02:45:15.774 15 Y 7 SQL耗时较长,建议优化 10,519毫秒 Insert Into Log(Category,Name=R470');Select last_insert_rowid() newid 02:45:15.774 15 Y 7 Transaction.Commit ReadCommitted 02:45:16.622 16 Y 9 Transaction.Begin ReadCommitted 02:45:16.622 16 Y 9 Insert Into Log(Category,12,'2017-01-27 02:45:06','ID=12,Name=R548');Select last_insert_rowid() newid 02:45:16.622 16 Y 9 Insert Into Log(Category,'2017-01-27 02:45:09',Name=R486');Select last_insert_rowid() newid 02:45:16.622 16 Y 9 Insert Into Log(Category,'2017-01-27 02:45:12',Name=R633');Select last_insert_rowid() newid 02:45:16.637 16 Y 9 Transaction.Commit ReadCommitted 从测试结果来看:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |