zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    vue-cli3.0配置开发环境,测试环境,线上环境
    jQuery使用CDN加速
    浏览器中JavaScript脚本代码的load、ready等方法的加载顺序
    使用 JavaScript 拦截和跟踪浏览器中的 HTTP 请求
    Node和NPM在Windows环境下绿色安装及配置
    Nodejs 中将html转换成pdf文件
    数学励志公式:每天进步一点点
    网页调用打印机打印时纸张A4的设置
    用JS或jQuery访问页面内的iframe,兼容IE/FF
    HTML to DOM
  • 原文地址:https://www.cnblogs.com/YuanSong/p/2719585.html
Copyright © 2011-2022 走看看