SQL 事务处理 锁

SQL Server是一个多任务多用户的数据库系统,使用锁和事务的机制来保证数据的一致性。

事务是单个的工作单元,在一个事务中定义多个数据修改操作,则表示在该事务中进行的所有数据修改均会提高,称为数据库中永久组成部分,如果事务遇到错误,且必须取消或回滚,则所有数据修改均被取消。即要么全部执行,要么全部不执行。

事务是作为单个逻辑工作单元执行的一系列操作。包含四个属性:原子性,一致性,隔离性,持久性。ACID.

数据库应用程序可以指定事务何时开始与结束,控制整个事务的运行。事务是基于连接的,一个连接中开始了一个事务只要没有进行提交或回滚,则这个连接后面所有执行的SQL操作都是事务的一部分。

事务在激活后可以有3种办法结束事务。一种是commit命令提交事务更改,一种是使用Rollback命令回滚事务更改,还有一种就是强行中断事务所在的连接(Kill命令)。

锁定是SQL Server数据库引擎用来同步多个用户同时对同一数据块的访问的一种机制。事务使用锁来保护自己不受其他事务对同一数据进行修改的影响。

在SQL Server事务处理中,如果多个任务的资源访问相互锁定将会发生死锁。

多表死锁。

高隔离级别造成单表死锁。

索引建立不当造成单表死锁。

死锁的监视预防

发生死锁最直观的表现就是系统抛出1205异常,将某个事务作为牺牲品。

使用DBCC命令或者是SQL Server Profiler可以获得死锁发生时的详细信息。

dbcc traceon(1222,1204,3605,-1)

预防:

按同一顺序访问对象。

避免事务中的用户交互。

事务尽量短。

使用较低的隔离级别。

简历正确的索引。

让不同的连接使用相同的锁定。

protected void Button2_Click(object sender, EventArgs e)
    {
        SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;database=aaaa;uid=sa;pwd=jcx");
        con.Open();
        SqlTransaction tran = con.BeginTransaction();//先实例SqlTransaction类,使用这个事务使用的是con 这个连接,使用BeginTransaction这个方法来开始执行这个事务
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = con;
        cmd.Transaction = tran;
        try
        {
             //在try{} 块里执行sqlcommand命令,
            cmd.CommandText = "update bb set moneys=moneys-'" + Convert.ToInt32(TextBox1.Text) + "' where ID='1'";
            cmd.ExecuteNonQuery();
            cmd.CommandText = "update bb set moneys=moneys+' aa ' where ID='2'";
            cmd.ExecuteNonQuery();
            tran.Commit();//如果两个sql命令都执行成功,则执行commit这个方法,执行这些操作
 
            Label1.Text = "添加成功";
        }
        catch
        {
            Label1.Text = "添加失败";
            tran.Rollback();//如何执行不成功,发生异常,则执行rollback方法,回滚到事务操作开始之前;
        }
 
    }

以上代码来之http://blog.sina.com.cn/s/blog_83baaf5d0100xalr.html

public DataSet getdataset(string sql)
    {
        DataSet ds = new DataSet();
        SqlConnection scn = new SqlConnection(conn);
        scn.Open();
        SqlCommand cmd = new SqlCommand(sql, scn);
        SqlDataAdapter sda = null;
        SqlTransaction st = scn.BeginTransaction();//scn事务初始化
        cmd.Transaction = st;//需要对cmd的事务对象初始化
        try
        {
            sda = new SqlDataAdapter(cmd);//获取查询结果
            sda.Fill(ds, "news");//使用DataAdapter的Fill方法(填充),返回填充后的ds
            st.Commit();//事务提交
        }
        catch (Exception)
        {
            st.Rollback();//异常,事务回滚
        }
        finally
        {
            scn.Close();
        }
        return ds;
    }

以上代码来自http://bigfly.blog.163.com/blog/static/183868370201141411182228/

原文地址:https://www.cnblogs.com/YuanSong/p/2719585.html