• 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/

  • 相关阅读:
    zabbix监控
    ipv4固定ip地址
    CentOS7 内核优化 修改参数
    流媒体服务器 red5
    linux安装git
    zabbix-钉钉报警媒介
    Windows下利用IIS建立网站并实现局域网共享
    docker的简单操作和端口映射
    docker概述和安装及基本操作
    VMware Workstation创建Windows2012server虚拟机
  • 原文地址:https://www.cnblogs.com/YuanSong/p/2719585.html
Copyright © 2020-2023  润新知