事务是作为单个逻辑单元执行的一系列操作,它是一个不可分割的工作逻辑单元。它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行。 举个例子,我们经常用到的 ATM 存取款机,比如转账的时候,是先减去转出账户的金额,然后再在指定转入账户的金额加上转出的金额。如果刚好这个时候转出的操作已经执行完成,但是由于系统的故障,导致转入的操作失败了。那么怎么办?这就需要用到事务了,只要事务里面有一条命令未成功执行,那么数据就会回滚到事务开始之前的状态。
在ADO.NET 中,可以使用Connection 和Transaction 对象来控制事务。若要执行事务,请执行下列操作:
优点: – 简单性 – 和数据据事务差不多的快 – 独立于数据库,不同数据库的专有代码被隐藏了
缺点: – 事务不能跨越多个数据库连接 – 事务执行在数据库连接层上,所以需要在事务过程中维护一个数据库连接。
C#private void btnRun_Click(object sender, EventArgs e)
{
string ConnectionString = System.Configuration.ConfigurationManager.AppSettings["DataConnString"].ToString();
using (SqlConnection conn = new SqlConnection(ConnectionString))
{
conn.Open();
SqlTransaction transaction = conn.BeginTransaction();
try
{
string sql = "INSERT INTO wms_material(id, material_no, mlfb, description, repair_type, location, actual_qty, qty) " +
"VALUES (@id, @material_no, @mlfb, @description, @repair_type, @location, @actual_qty, @qty)";
SqlCommand sqlcom = new SqlCommand(sql, conn);
sqlcom.Transaction = transaction;
sqlcom.Parameters.Add(new SqlParameter("@id", Guid.NewGuid()));
sqlcom.Parameters.Add(new SqlParameter("@material_no", "A"));
sqlcom.Parameters.Add(new SqlParameter("@mlfb", "mlfb"));
sqlcom.Parameters.Add(new SqlParameter("@description", "A_1"));
sqlcom.Parameters.Add(new SqlParameter("@repair_type", "维修"));
sqlcom.Parameters.Add(new SqlParameter("@location", "BJ"));
sqlcom.Parameters.Add(new SqlParameter("@actual_qty", 10));
sqlcom.Parameters.Add(new SqlParameter("@qty", 1));
sqlcom.ExecuteNonQuery();
sqlcom.Parameters.Clear();
sqlcom.Parameters.Add(new SqlParameter("@id", Guid.NewGuid()));
sqlcom.Parameters.Add(new SqlParameter("@material_no", "A1"));
sqlcom.Parameters.Add(new SqlParameter("@mlfb", "mlfb111mlfb111111111111111111111mlfb111mlfb11111111111111111111111111111"));
sqlcom.Parameters.Add(new SqlParameter("@description", "A_2"));
sqlcom.Parameters.Add(new SqlParameter("@repair_type", "维修"));
sqlcom.Parameters.Add(new SqlParameter("@location", "BJ"));
sqlcom.Parameters.Add(new SqlParameter("@actual_qty", 20));
sqlcom.Parameters.Add(new SqlParameter("@qty", 1));
sqlcom.ExecuteNonQuery();
transaction.Commit();
}
catch(Exception ex)
{
transaction.Rollback();
}
}
}
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!