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