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>