【winfrom】ADO.NET中事务 的创建与使用

时间:2020-12-29 00:58:26
 public partial class Form1 : Form
    {
        private readonly static string connString = ConfigurationManager.ConnectionStrings["connString"].ConnectionString;
        public Form1()
        {
            InitializeComponent();
        }

        /*今天的课程内容是:ADO.NET中事务 的创建与使用

          1 事务原理的简单回顾
          2 事务的隔离级别介绍
          3 在Ado.net中事务的启动与执行

         *一系列操作  一个单元    成功,提交   失败  回滚到最初  
         * 只要成功提交后,就不能再回滚
         * 原子性  一致性  隔离性 持久性
         * 
         * 多事务并发,对同一数据  几种错误:
         * 1.更新丢失  多用户   同一数据  更新, 覆盖  读取异常
         * 2.不可重复读 一个用户读取数据,另一个用户 更新这条数据,再次读取,多次读取不一致
         * 3.脏读 第一个事务读取第二个事务正在更新的数据,更新并未完成,造成第一个事务读取到数据,一部分更新,另一部分没更新。
         * 4.幻读 第一个事务读取结果集,第二个事务又同时对这个结果集进行增删改操作,第一个事务再次读取,数据发生丢失或新增。
         
         * 
         * 锁定  为解决这些问题,一个事务在操作数据的时候,其他事务不能干涉。
         * 
         * 设置隔离级别
         * read uncommitted 最低的  脏读
         * read committed 默认  不能脏读,存在不可重复读,幻读
         * Repeatable read  解决不可重复读
         * Snapshot  解决不可重复读
         * Serializable *别 解决幻读
         */




        private void btnAdd_Click(object sender, EventArgs e)
        {
            string sqlDeptAdd = "insert into T_Department(DeptName,Manager) values (@dName,@manager);select @@identity";
            string sqlUserAdd = "insert into T_User(UserName,Age,DeptId) values(@name,@age,@deptId)";
            using (SqlConnection conn = new SqlConnection(connString))
            {
               conn.Open();
               SqlTransaction tran =  conn.BeginTransaction();//启动事务,conn是OPen状态  read committed
                //一系列的操作
               SqlCommand cmd = new SqlCommand();
               cmd.Connection = conn;
               cmd.Transaction = tran;
               try
               {
                   cmd.CommandText = sqlDeptAdd;
                   SqlParameter[] paraDept = new SqlParameter[]{
                       new SqlParameter("@dName",txtDeptName.Text.Trim()),
                       new SqlParameter("@manager",txtManager.Text.Trim())
                   };
                   cmd.Parameters.AddRange(paraDept);
                   object oId = cmd.ExecuteScalar();

                   cmd.CommandText = sqlUserAdd;
                   SqlParameter[] paraUser = new SqlParameter[]{
                       new SqlParameter("@name",txtName.Text.Trim()),
                       new SqlParameter("@age",int.Parse(txtAge.Text.Trim())),
                       new SqlParameter("@deptId",Convert.ToInt32(oId))
                   };
                   cmd.Parameters.Clear();
                   cmd.Parameters.AddRange(paraUser);
                   cmd.ExecuteNonQuery();

                   tran.Commit();
               }
               catch (Exception ex)
               {
                   tran.Rollback();
                   MessageBox.Show(ex.Message);
               }
               
               finally
               {
                   tran.Dispose();
               }
               
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            LoadData();
        }

        private void LoadData()
        {
            DataTable dt = new DataTable();
            using (SqlConnection conn = new SqlConnection(connString))
            {
                SqlDataAdapter da = new SqlDataAdapter("select u.Id,UserName,Age,DeptId,DeptName from T_User u,T_Department d where u.DeptId=d.Id", conn);
                da.Fill(dt);
            }
            dataGridView1.DataSource = dt;
        }
    }

  APP.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <connectionStrings>
    <add name ="connString" connectionString ="server=.;database=Test;uid=sa;pwd=123456;"/>
  </connectionStrings>
</configuration>