敖士伟 事务 体会一

来源:互联网 发布:软件企业评估减税 编辑:程序博客网 时间:2024/06/05 00:52
如果SqlCommand依附的连接上有事务,那么对必须给SqlCommand指定事务.不然出现异常:
异常详细信息: System.InvalidOperationException: 如果分配给命令的连接位于本地挂起事务中,ExecuteNonQuery 要求命令拥有事务。命令的 Transaction 属性尚未初始化。
代码:
  1.     string connString = "Data Source=192.168.0.x;Initial Catalog=test1;User ID=dev_user;Password=dev_user";
  2.             SqlConnection conn = new SqlConnection(connString);
  3.             conn.Open();
  4.             SqlTransaction transaction = conn.BeginTransaction(IsolationLevel.Serializable);
  5.             SqlCommand sqlcomm = new SqlCommand();
  6.             sqlcomm.Connection = conn;
  7.             //sqlcomm.Transaction = transaction;
  8.             sqlcomm.CommandText = "insert into yg(yg_name,b_id) values('b',1)";
  9.             sqlcomm.ExecuteNonQuery();
  10.             transaction.Rollback();
  11.             conn.Close();
2.事务的Rollback()操作其实是使用了与sql相反的操作,如insert的Rollback为delete.
意思就是在Rollback之前,sql已真实地去数据库进行了操作.

3.事务是引用类型,其它过程对其的操作会影响它.

  1. protected void Button1_Click(object sender, EventArgs e)
  2.         {
  3.             string connString = "Data Source=192.168.0.211;Initial Catalog=test1;User ID=dev_user;Password=dev_user";
  4.             SqlConnection conn = new SqlConnection(connString);
  5.             conn.Open();
  6.             SqlTransaction transaction = conn.BeginTransaction(IsolationLevel.Serializable);
  7.             SqlCommand sqlcomm = new SqlCommand();
  8.             sqlcomm.Connection = conn;
  9.             sqlcomm.Transaction = transaction;
  10.             sqlcomm.CommandText = "insert into yg(yg_name,b_id) values('c',1)";
  11.             sqlcomm.ExecuteNonQuery();
  12.             //transaction.Rollback();
  13.             myrollback(transaction);//事务是引用类型,其它过程对其的操作会影响它.
  14.             conn.Close();
  15.             Label1.Text = "ok";
  16.         }
  17.         void myrollback(SqlTransaction transaction)
  18.         {
  19.             transaction.Rollback();//insert无效
  20.         }