欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-05 18:04:48
...
 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>