.NET中 关于脏读 不可重复读与幻读的代码示例

所属分类: 网络编程 / ASP.NET 阅读数: 1192
收藏 0 赞 0 分享

并发可能产生的三种问题

脏读

定义:A事务执行过程中B事务读取了A事务的修改,但是A事务并没有结束(提交),A事务后来可能成功也可能失败。

比喻:A修改了源代码并且并没有提交到源代码系统,A直接通过QQ将代码发给了B,A后来取消了修改。

代码示例

复制代码 代码如下:

[TestMethod]
         public void 脏读_测试()
         {
             //前置条件
             using (var context = new TestEntities())
             {
                 Assert.AreEqual(1, context.Tables.Count());
             }

             var autoResetEvent = new AutoResetEvent(false);

             var transactionOptions1 = new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted };
             var transactionOptions2 = new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted };

             using (var ts1 = new TransactionScope(TransactionScopeOption.Required, transactionOptions1))
             {
                 //添加数据
                 using (var context = new TestEntities())
                 {
                     context.Tables.Add(new Table() { Id = Guid.NewGuid(), Name = "段光伟" });
                     context.SaveChanges();
                 }

                 ThreadPool.QueueUserWorkItem(data =>
                 {
                     using (var ts2 = new TransactionScope(TransactionScopeOption.Required, transactionOptions2))
                     {
                         //脏读测试
                         using (var context = new TestEntities())
                         {
                             Assert.AreEqual(2, context.Tables.Count());
                         }
                     }

                     autoResetEvent.Set();
                 });

                 autoResetEvent.WaitOne();
             }

             //前置条件
             using (var context = new TestEntities())
             {
                 Assert.AreEqual(1, context.Tables.Count());
             }
         }

不可重复读

定义:A事务读取了两次数据,在这两次的读取过程中B事务修改了数据,A事务的这两次读取出来的数据不一样了(不可重复读)。

比喻:A在做源代码审查,在审查的过程中获取了两次源代码,在这两次获取期间B修改了源代码,B修改的很可能是A审查过的代码,而这部分代码可能不符合规范了。

代码示例

复制代码 代码如下:

[TestMethod]
         public void 不可重复读_测试()
         {
             var autoResetEvent = new AutoResetEvent(false);

             var transactionOptions1 = new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted };
             var transactionOptions2 = new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted };

             using (var ts1 = new TransactionScope(TransactionScopeOption.Required, transactionOptions1))
             {
                 //前置条件
                 using (var context = new TestEntities())
                 {
                     Assert.AreEqual("李妞妞", context.Tables.First().Name);
                 }

                 ThreadPool.QueueUserWorkItem(data =>
                 {
                     using (var ts2 = new TransactionScope(TransactionScopeOption.Required, transactionOptions2))
                     {
                         //修改数据
                         using (var context = new TestEntities())
                         {
                             context.Tables.First().Name = "段光伟";
                             context.SaveChanges();
                         }

                         ts2.Complete();   
                     }

                     autoResetEvent.Set();
                 });

                 autoResetEvent.WaitOne();

                 //不可重复读测试
                 using (var context = new TestEntities())
                 {
                     Assert.AreEqual("段光伟", context.Tables.First().Name);
                 }
             }
         }

幻读

定义:A事务读取了两次数据,在这两次的读取过程中B事务添加了数据,A事务的这两次读取出来的集合不一样了(幻读)。

比喻:A在统计文件数据,为了统计精确A统计了两次,在这两次的统计过程中B添加了一个文件,A发现这两次统计的数量不一样(幻读),A会感觉自己的脑袋有点头疼。

代码示例

复制代码 代码如下:

[TestMethod]
         public void 幻读_测试()
         {
             var autoResetEvent = new AutoResetEvent(false);

             var transactionOptions1 = new TransactionOptions { IsolationLevel = IsolationLevel.RepeatableRead };
             var transactionOptions2 = new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted };

             using (var ts1 = new TransactionScope(TransactionScopeOption.Required, transactionOptions1))
             {
                 //前置条件
                 using (var context = new TestEntities())
                 {
                     Assert.AreEqual(1, context.Tables.Count());
                 }

                 ThreadPool.QueueUserWorkItem(data =>
                 {
                     using (var ts2 = new TransactionScope(TransactionScopeOption.Required, transactionOptions2))
                     {
                         //添加数据
                         using (var context = new TestEntities())
                         {
                             context.Tables.Add(new Table() { Id = Guid.NewGuid(), Name = "段光伟" });
                             context.SaveChanges();
                         }

                         ts2.Complete();
                     }

                     autoResetEvent.Set();
                 });

                 autoResetEvent.WaitOne();

                 //幻读测试
                 using (var context = new TestEntities())
                 {
                     Assert.AreEqual(2, context.Tables.Count());
                 }
             }
         }

四种隔离级别如何处理并发问题
  脏读 不可重复读 幻读
读未提交 允许 允许 允许
读已提交 不允许 允许 允许
可重复读 不允许 不允许 允许
串行化 不允许 不允许 不允许

更多精彩内容其他人还在看

ASP.Net 之Datalist删除功能详解附代码

ASP.Net 之Datalist删除功能详解附代码,需要的朋友可以参考一下
收藏 0 赞 0 分享

ASP.NET(C#)验证数字的两种方法

ASP.NET(C#)验证数字的两种方法,需要的朋友可以参考一下
收藏 0 赞 0 分享

此页的状态信息无效,可能已损坏 的处理办法及原因分析

此页的状态信息无效,可能已损坏 的处理办法及原因分析,需要的朋友可以参考一下
收藏 0 赞 0 分享

MultiLine 换行后实现读取不换行的具体思路

输入内容中有换行,保存到数据库,直接查看感觉没有换行,但查询结果“以文本格式显示结果”你就会发现 其实是有换行的,下面与大家分享下具体的解决方法
收藏 0 赞 0 分享

swfupload ajax无刷新上传图片实例代码

在这里上传图片就需要用到ajax无刷新上传图片,这里面包含的东西不是一点半点。这里用到的是一个插件swfupload实现无刷新上传图片,感兴趣的朋友可以参考下哈
收藏 0 赞 0 分享

静态gb2312编码在项目传值出现中文乱码现象

参考的美工静态页面是gb2312格式的,当此编码拿到项目中后,utf-8编码的系统,加载页面时,会出现样式问题,比如不能正常居中等
收藏 0 赞 0 分享

System.Timers.Timer定时执行程序示例代码

如果是某个逻辑功能的定时,可以将code放到逻辑功能的类的静态构造函数中,在该逻辑类第一次执行时,静态构造函数会被调用,则定时自然启动
收藏 0 赞 0 分享

分享下Asp.Net面试题目及答案集合

这篇文章主要是总结asp.net开发人员在面试过程中常遇到的一些问题小结,需要的朋友可以参考下
收藏 0 赞 0 分享

给自定义Web控件添加事件(前后台代码)

给自定义控件(Web Control)添加事件具体前后台代码如下,感兴趣的朋友可以参考下哈
收藏 0 赞 0 分享

ASP.NET过滤器的应用方法介绍

ASP.NET过滤器的应用方法介绍,需要的朋友可以参考一下
收藏 0 赞 0 分享
查看更多