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/