事务处理(二)(System.Transactions)

  1  using  System;
  2  using  System.Collections.Generic;
  3  using  System.Web;
  4 
  5 
  6  using  MySql.Data.MySqlClient;
  7  using  System.Data;
  8  using  System.Transactions;
  9  using  System.Data.SqlClient;
 10 
 11  namespace  Utility
 12  {
 13       public   enum  DataBase
 14      {
 15          MsSQL,
 16          MySQL
 17      }
 18       public   static   class  Transaction
 19      {
 20           private   static  SQL CurSQL;
 21 
 22           public   static   void  BeginTransaction(DataBase db)
 23          {
 24               switch  (db)
 25              {
 26                   case  DataBase.MySQL:
 27                      CurSQL  =   new  MySQL();
 28                      CurSQL.BeginTransaction();
 29                       break ;
 30                   case  DataBase.MsSQL:
 31                      CurSQL  =   new  MsSQL();
 32                      CurSQL.BeginTransaction();
 33                       break ;
 34              }
 35          }
 36           public   static   void  Commit(DataBase db)
 37          {
 38               switch  (db)
 39              {
 40                   case  DataBase.MySQL:
 41                      CurSQL  =   new  MySQL();
 42                      CurSQL.Commit();
 43                       break ;
 44                   case  DataBase.MsSQL:
 45                      CurSQL  =   new  MsSQL();
 46                      CurSQL.Commit();
 47                       break ;
 48              }
 49 
 50          }
 51           public   static   void  Rollback(DataBase db)
 52          {
 53               switch  (db)
 54              {
 55                   case  DataBase.MySQL:
 56                      CurSQL  =   new  MySQL();
 57                      CurSQL.Rollback();
 58                       break ;
 59                   case  DataBase.MsSQL:
 60                      CurSQL  =   new  MsSQL();
 61                      CurSQL.Rollback();
 62                       break ;
 63              }
 64          }
 65 
 66      }
 67 
 68       public   class  SQL
 69      {
 70           public   virtual   void  BeginTransaction() { }
 71           public   virtual   void  Commit() { }
 72           public   virtual   void  Rollback() { }
 73      }
 74 
 75       public   class  MySQL : SQL
 76      {
 77           private   readonly   static  log4net.ILog ilog  =  log4net.LogManager.GetLogger( typeof (MySQL)); // 日志输出
 78 
 79           private   static  MySqlConnection Connect  =   new  MySqlConnection(); // 全局事务开启式所需的数据库连接对象
 80           private   static  MySqlTransaction Transaction; // 全局事务
 81           private   static  MySqlCommand Command  =   new  MySqlCommand( "" , Connect); // 全局事务开启时的数据执行对象
 82 
 83 
 84           private   static   bool  _StartTran  =   false ; // 全局事务是否开启
 85           static   string  _strConnect  =   null ;
 86           ///   <summary>
 87           ///  设置或获取连接字符串
 88           ///   </summary>
 89           public   static   string  strConnect
 90          {
 91               get  {  return  _strConnect; }
 92               set  { _strConnect  =  value; }
 93          }
 94 
 95           ///   <summary>
 96           ///  开启全局事务处理
 97           ///   </summary>
 98           public   override   void  BeginTransaction()
 99          {
100               if  (_StartTran)
101              {
102                  ilog.Error( " 系统中存在事务挂起,请提交事务后重试 " );
103                   throw   new  Exception( " 系统中存在事务挂起,请提交事务后重试 " );
104              }
105              Connect.ConnectionString  =  strConnect;
106               if  (Connect.State  ==  ConnectionState.Closed)
107              {
108                  Connect.Open();
109                  Transaction  =  Connect.BeginTransaction();
110                  Command.Transaction  =  Transaction;
111              }
112              _StartTran  =   true ;
113          }
114 
115           ///   <summary>
116           ///  提交全局事务处理
117           ///   </summary>
118           public   override   void  Commit()
119          {
120               if  (_StartTran)
121              {
122                  Command.Transaction.Commit(); // 事务提交
123                  Transaction.Dispose();
124                  Command.Dispose();
125                  Connect.Close();
126                  Connect.Dispose();
127                  _StartTran  =   false ;
128              }
129 
130          }
131 
132           ///   <summary>
133           ///  回滚全局事务处理
134           ///   </summary>
135           public   override   void  Rollback()
136          {
137               if  (_StartTran)
138              {
139                  Command.Transaction.Rollback(); // 事务回滚
140                  Transaction.Dispose();
141                  Command.Dispose();
142                  Connect.Close();
143                  Connect.Dispose();
144                  _StartTran  =   false ;
145              }
146 
147          }
148           ///   <summary>
149           ///  执行带参数SQL语句,返回影响的记录数
150           ///   </summary>
151           ///   <param name="SQLString"> SQL语句 </param>
152           ///   <param name="cmdParms"> 参数的集合 </param>
153           ///   <returns> 影响的记录数 </returns>
154           public   int  ExecuteSql( string  SQLString,  params  MySqlParameter[] cmdParms)
155          {
156 
157               if  (_StartTran) // 用户开启了事务处理
158              {
159                   try
160                  {
161                      Command.CommandText  =  SQLString;
162                      PrepareCommand(Command, cmdParms); // 附加参数列表
163                       return  Command.ExecuteNonQuery();
164                  }
165                   catch  (MySqlException ex)
166                  {
167                      ilog.Error(ex.Message);
168                       throw   new  Exception(ex.Message);
169                  }
170              }
171               else
172              {
173                   return   0 ;
174              }
175          }
176           ///   <summary>
177           ///  加载参数
178           ///   </summary>
179           ///   <param name="cmd"> cmd对象 </param>
180           ///   <param name="cmdParms"> 参数 </param>
181           private   void  PrepareCommand(MySqlCommand cmd, MySqlParameter[] cmdParms)
182          {
183               if  (cmdParms  !=   null )
184              {
185                  cmd.Parameters.Clear();
186                   foreach  (MySqlParameter parameter  in  cmdParms)
187                  {
188                       if  ((parameter.Direction  ==  ParameterDirection.InputOutput  ||  parameter.Direction  ==  ParameterDirection.Input)  &&  (parameter.Value  ==   null ))
189                      {
190                          parameter.Value  =  DBNull.Value;
191                      }
192                      cmd.Parameters.Add(parameter);
193                  }
194              }
195          }
196 
197      }
198 
199       public   class  MsSQL : SQL
200      {
201           private   readonly   static  log4net.ILog ilog  =  log4net.LogManager.GetLogger( typeof (MySQL)); // 日志输出
202 
203           private   static  CommittableTransaction tx  =   new  CommittableTransaction();
204           private   static  SqlConnection conn  =   new  SqlConnection( " Server=.;Initial Catalog=Test;User ID=sa;Pwd=sa " );
205 
206           private   static   bool  _StartTran  =   false ; // 全局事务是否开启
207 
208           public   override   void  BeginTransaction()
209          {
210              conn.Open();
211 
212              conn.EnlistTransaction(tx);
213              _StartTran  =   true ;
214          }
215           public   override   void  Commit()
216          {
217              tx.Commit();
218              conn.Close();
219              tx.Dispose();
220              _StartTran  =   false ;
221          }
222           public   override   void  Rollback()
223          {
224              tx.Rollback();
225              conn.Close();
226              tx.Dispose();
227              _StartTran  =   false ;
228          }
229           ///   <summary>
230           ///  执行带参数SQL语句,返回影响的记录数
231           ///   </summary>
232           ///   <param name="SQLString"> SQL语句 </param>
233           ///   <param name="cmdParms"> 参数的集合 </param>
234           ///   <returns> 影响的记录数 </returns>
235           public   int  ExecuteSql( string  SQLString,  params  SqlParameter[] cmdParms)
236          {
237               if  (_StartTran) // 用户开启了事务处理
238              {
239                   try
240                  {
241                      SqlCommand Command  =  conn.CreateCommand();
242 
243                      Command.CommandText  =  SQLString;
244                      PrepareCommand(Command, cmdParms); // 附加参数列表
245                       return  Command.ExecuteNonQuery();
246                  }
247                   catch  (MySqlException ex)
248                  {
249                      ilog.Error(ex.Message);
250                       throw   new  Exception(ex.Message);
251                  }
252              }
253               else
254              {
255                   return   0 ;
256              }
257 
258          }
259           ///   <summary>
260           ///  加载参数
261           ///   </summary>
262           ///   <param name="cmd"> cmd对象 </param>
263           ///   <param name="cmdParms"> 参数 </param>
264           private   void  PrepareCommand(SqlCommand cmd, SqlParameter[] cmdParms)
265          {
266               if  (cmdParms  !=   null )
267              {
268                  cmd.Parameters.Clear();
269                   foreach  (SqlParameter parameter  in  cmdParms)
270                  {
271                       if  ((parameter.Direction  ==  ParameterDirection.InputOutput  ||  parameter.Direction  ==  ParameterDirection.Input)  &&  (parameter.Value  ==   null ))
272                      {
273                          parameter.Value  =  DBNull.Value;
274                      }
275                      cmd.Parameters.Add(parameter);
276                  }
277              }
278          }
279      }
280  }


 

 

 1  protected   void  Page_Load( object  sender, EventArgs e)
 2          {
 3               try
 4              {
 5                  Transaction.BeginTransaction(DataBase.MsSQL);
 6 
 7                  Bll.UserBll ub  =   new  Bll.UserBll();
 8 
 9                  Model.User user  =   new  Model.User();
10 
11                  user.Name  =   " 不信算了 " ;
12 
13                  ub.InserUser(user);
14 
15                  Model.Order od  =   new  Model.Order();
16 
17                  od.UserID  = int .Parse(name.Text);
18                  od.Orderitem  =   " 黄瓜 " ;
19 
20                  ub.InserOrder(od);
21 
22                  Transaction.Commit(DataBase.MsSQL);
23 
24              } catch (Exception ex)
25              {
26                  Transaction.Rollback(DataBase.MsSQL);
27              }
28          }


 

你可能感兴趣的:(transaction)