SQL Server 2000+ADO.NET实现并发控制

原创 2007年09月24日 16:01:00

http://www.cnblogs.com/zhenyulu/articles/330494.html 

参考了上面这片对并发控制处理的文章,有些迷茫,自己做了实验,如下:

private static string connstr = "Server=(local);Database=DBApp;Trusted_Connection=True;";
        SqlConnection conn;
        SqlConnection conn2;
        SqlTransaction tran;
        SqlTransaction tran2;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Setup();
            //读取数据
            SqlCommand cmd = conn.CreateCommand();
            cmd.Connection = conn;
            cmd.CommandText = "select * from SC where ID=1 and cno=1";
            cmd.Transaction = tran;

            try
            {
                SqlDataReader dr=cmd.ExecuteReader();
                while (dr.Read())
                {
                    textBox1.Text = dr[0].ToString();
                    textBox2.Text = dr[1].ToString();
                    textBox3.Text = dr[2].ToString();
                }
                dr.Close();
               
            }
            catch (Exception ee)
            {
                MessageBox.Show(ee.Message);
                tran.Rollback();
            }

        }

        private void button1_Click(object sender, EventArgs e)
        {
            Setup();
            //保存数据
            SqlCommand cmd = conn2.CreateCommand();
            cmd.Connection = conn2;
            cmd.CommandText = "update SC set mark="+Convert.ToDouble(textBox3.Text.ToString())+" where ID=1 and cno=1";
            cmd.Transaction = tran2;

            try
            {
                cmd.ExecuteScalar();
                tran2.Commit();
                tran.Commit();
            }
            catch (Exception ee)
            {
                MessageBox.Show(ee.Message);
                tran2.Rollback();
            }
            finally
            {
                conn.Close();
                conn2.Close();
            }
        }

        private void Setup()
        {
            conn = new SqlConnection(connstr);
            conn.Open();
            conn2=new SqlConnection(connstr);
            conn2.Open();

            tran = conn.BeginTransaction(IsolationLevel.RepeatableRead);
            tran2 = conn2.BeginTransaction(IsolationLevel.RepeatableRead);

            
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Close();
        }

同时开两个窗口,依次在两个窗口内对数据库进行操作,RepeatableRead模式下,保存操作都失败,究其原由是在三封锁对应RepeatableRead模式,该模式对数据读加了S锁(共享锁),并且要到事务结束才会释放,第一个事务在需要update的时候,必须给数据加x锁(写锁),因为此时第二个窗口的事务尚未结束,也就是说s锁还加在这个处理之上,在s锁未失效的情况下,其他事务只能对该数据对象加s锁而不能加x锁,从而造成了事务一也就是窗口一在更新的时候出现死锁,等待窗口二事务的解锁。超时后,事务一处理回滚,更新不成功。

这种方式,虽然能避免并发,但是处理方式不能友好,觉得还是可以用Scott Mitchell在ASP.NET2.0数据指南中的方法,在where字句中处理并发问题。关于效率问题,以后有时间再做测试。

以上两个事务,在同时改为ReadCommitted的模式下,在并发时,测试失败,两个窗口都可以更新数据。

SQL server数据库并发控制--加锁

http://blog.csdn.net/zdplife/article/details/48035837 当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作...
  • sinat_26230689
  • sinat_26230689
  • 2016年06月13日 16:40
  • 1250

锁与并发-SQL Server

SQL Server锁机制与并发机制,包括事务ACID特性详解,事务隔离级别,锁的种类,版本控制机制等...
  • sunxianghuang
  • sunxianghuang
  • 2016年07月07日 13:33
  • 3243

大数据量高并发访问SQL优化方法

保证在实现功能的基础上,尽量减少对数据库的访问次数;通过搜索参数,尽量减少对表的访问行数,最小化结果集,从而减轻网络负担;能够分开的操作尽量分开处理,提高每次的响应速度;在数据窗口使用SQL时,尽量把...
  • qq_35624642
  • qq_35624642
  • 2017年02月25日 17:50
  • 2452

SQLServer 复杂存储过程并发优化(案例)

一个存储过程,1500行代码,内部有一个查询,关联使用了200多张表(其中有重复的表),并发线程执行,耗时15秒左右,结果返回一般几行记录。这个存储过程是系统中最耗时、最消耗性能的。今天突然想着得优化...
  • kk185800961
  • kk185800961
  • 2016年07月18日 12:32
  • 2520

SQL Server数据库系列——锁和并发

最近在使用数据库,综合各方面原因,选择了SQL Server2008.为了对使用的工具有更加深入的了解,所以仔细地阅读了经典翻译书籍《SQL Server 2008高级程序设计》,在此将读书过程中的感...
  • walkman_lfq
  • walkman_lfq
  • 2016年07月20日 20:36
  • 1294

sql server在高并发状态下同时执行查询与更新操作时的死锁问题

最近在项目上线使用过程中使用SqlServer的时候发现在高并发情况下,频繁更新和频繁查询引发死锁。通常我们知道如果两个事务同时对一个表进行插入或修改数据,会发生在请求对表的X锁时,已经被对方持有了。...
  • gukehui2012
  • gukehui2012
  • 2017年03月13日 10:12
  • 300

sql server中高并发情况下 同时执行select和update语句死锁问题 (二)

SQL Server死锁使我们经常遇到的问题,数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁。希望对您学习SQL Server死锁方面能有所帮助。         ...
  • lishehe
  • lishehe
  • 2014年12月31日 23:11
  • 7655

SQL数据库(9)——并发控制

多用户数据库系统的存在允许多个用户同时使用,在同一时刻并发运行的事务数可达数百个不同的多事务执行方式事务串行执行每个时刻只有一个事务运行,其他事务必须等到这个事务结束后方能运行 交叉并发方式并行事务并...
  • longxinghaofeng
  • longxinghaofeng
  • 2017年01月01日 14:16
  • 314

SQL Server 2012的功能和性能优化

微软已经发布了众所期待的 SQL Server 2012,让我们来看看这个新版给我们带来了什么激动人心的功能吧。 1. AlwaysOn -这个功能将数据库的镜像提到了一个新的高度。用户可以针对一组...
  • luoxq111
  • luoxq111
  • 2017年02月22日 10:39
  • 315

sqlserver用timestamp帮助解决数据并发冲突

关于并发请求,网上很多朋友都说的很详细了,我就不在这里献丑了。这里只记录下刚刚完工的那个项目里自己是如何用timestamp处理的,以备日后不时之需。 在sqlserver里有个timestamp的...
  • u011014032
  • u011014032
  • 2015年01月20日 23:53
  • 1338
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL Server 2000+ADO.NET实现并发控制
举报原因:
原因补充:

(最多只允许输入30个字)