事务支持

规则引擎通常不支持事务。 但是,可以使用 DataConnection 对象以事务方式更新数据库,如以下步骤所示:

  1. 使用连接字符串创建 SqlConnection 对象,然后打开连接。

    SqlConnection connection = new SqlConnection("Initial Catalog=Northwind;Data Source=(local);Integrated Security=SSPI;");  
    connection.Open();  
    
  2. 通过在步骤 1 中创建的连接对象上调用 BeginTransaction 方法创建 SqlTransaction 对象。

    SqlTransaction transaction = connection.BeginTransaction();  
    
  3. 使用在步骤 1 和步骤 2 中创建的连接和事务对象创建 DataConnection 对象。

    DataConnection dc = new DataConnection(datasetName, tableName, connection, transaction);  
    
  4. DataConnection 对象作为事实以及要传递给策略的任何其他事实一起传递,并执行策略。

    //Passing a .NET object as a fact along with the data connection  
    MyClass obj = new MyClass();  
    object[] facts = new object[2];  
    facts[0] = dc;  
    facts[1] = obj;  
    Policy pol = new Policy(policyName);  
    policy.Execute(facts);    
    
  5. 对数据连接对象调用 Update 方法。 执行策略时,所进行的所有更新都是在内存中完成的。 必须对数据连接对象调用 Update 方法才能更新数据库。

    dc.Update();  
    
  6. 现在,请根据自己的逻辑对数据连接对象调用 CommitRollback

    //Checking the value of PropertyA in .net object   
    //to decide whether to commit or rollback  
    if (obj.PropertyA == true)  
    transaction.Commit();  
    else  
    transaction.Rollback();  
    
    
  7. 关闭连接,并释放策略对象。

    sqlCon.Close();  
    policy.Dispose();  
    

    下列代码是上述所有步骤的完整代码:

SqlConnection connection = new SqlConnection("Initial Catalog=Northwind;Data Source=(local);Integrated Security=SSPI;");  
connection.Open();  
SqlTransaction transaction = connection.BeginTransaction();  
DataConnection dc = new DataConnection(datasetName, tableName, connection, transaction);  
MyClass obj = new MyClass();  
object[] facts = new object[2];  
facts[0] = dc;  
facts[1] = obj;  
Policy pol = new Policy(policyName);  
policy.Execute(facts);    
dc.Update();  
if (obj.PropertyA == true)  
transaction.Commit();  
else  
transaction.Rollback();  
sqlCon.Close();  
policy.Dispose();  

注释

  • 还可以使用 OleDbConnectionOleDbTransaction 对象,而不是使用 SqlConnectionSqlTransaction 对象以事务方式执行数据库更新。

  • 所有通过策略进行的修改都是在内存中完成的。 必须对 DataConnection 对象调用 Update 方法以更新数据库。

  • 可以通过分别调用 DataConnection 对象的 CommitRollback 方法提交或回滚事务。