ADO.NET笔记——执行事务

相关知识:

  1. 处于同一事务(Transaction)内的一组操作,要么都成功执行,最后完全提交;但如果只要有任何一个操作失败或者出问题,所有值钱执行的操作也都取消并恢复到初始状态(即回滚)
  2. SqlTransacttion代表从ADO.NET中发出的事务

 

代码示例:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Data;
 7 using System.Data.SqlClient;
 8 
 9 namespace ConsoleApplication13
10 {
11     class Program
12     {
13         static string strConn = @"server=Joe-PC;database=AccountDBforSQLInjection;uid=sa;pwd=root";
14         static SqlConnection conn = new SqlConnection(strConn);
15 
16         static string sql1 = "INSERT INTO Account(AccountID,AccountName,password) VALUES"
17             + "(100,'sql1','123456')";//此命令正确
18         static string sql2 = "INSERT INTO Account(AccountID,AccountName1,password) VALUES"
19             + "(100,'sql2','123456')";//此命令因有拼写错误将会失败
20 
21         static SqlCommand cmd1 = new SqlCommand(sql1, conn);
22         static SqlCommand cmd2 = new SqlCommand(sql2, conn);
23 
24         static void Main(string[] args)
25         {
26             //OperationWithoutTransaction();
27             OperationWithTransaction();
28         }
29 
30         static void OperationWithoutTransaction()
31         {
32             conn.Open();
33 
34             try
35             {
36                 cmd1.ExecuteNonQuery();
37                 cmd2.ExecuteNonQuery();
38             }
39             catch (Exception e)
40             {
41                 Console.WriteLine("执行失败。");
42                 Console.WriteLine(e);
43             }
44             finally
45             {
46                 conn.Close();
47             }
48         }
49 
50         static void OperationWithTransaction()
51         {
52             conn.Open();
53             //连接打开后,才能启动事务
54             SqlTransaction trans = conn.BeginTransaction();
55             //将两个操作添加到同一个事务中
56             cmd1.Transaction = trans;
57             cmd2.Transaction = trans;
58 
59             try
60             {
61                 cmd1.ExecuteNonQuery();
62                 cmd2.ExecuteNonQuery();
63                 //如果没有出现异常,则提交事务
64                 trans.Commit();
65             }
66             catch (Exception e)
67             {
68                 Console.WriteLine("执行失败,事务回滚。");
69                 Console.WriteLine(e);
70                 //执行回滚
71                 trans.Rollback();
72             }
73             finally
74             {
75                 conn.Close();
76             }
77         }
78     }
79 }

 

程序分析:

  1. 没有使用事务时,如果命令1执行正确,而命令2执行错误,则命令1的修改将成功保存到数据库中
  2. 使用事务之后,只要有任何一个命令错误,则另个命令都不会对数据库造成影响

 

posted @ 2015-03-21 16:32  .Joe.Chen  阅读(433)  评论(0编辑  收藏  举报