【问题标题】:data integrity in sql server , using a mediator between users and actual tables of sql serversql server 中的数据完整性,在用户和 sql server 的实际表之间使用中介
【发布时间】:2011-03-07 05:57:55
【问题描述】:

在 sql server 中是否有任何中介类的东西充当用户和实际表之间的层?

就像我想要的那样,当用户从我的 .net winform 应用程序中插入数据时,首先,它被插入到一个调解器中,然后它进入实际的表并被插入。

我想要这个,因为一旦用户插入数据发生电源故障,那么我的实际表将是安全的,只有调解器会受到影响,并且在调解器中我将使用 TRANSACTIONS 回滚和提交。

就像我会使用这个:如果调解器完全更新了新数据,然后提交它,然后插入到实际表中,否则,回滚调解器本身而不触及原始表。

【问题讨论】:

  • 如果您在 Winforms 应用程序中使用事务,则无需额外的“中介”即可获得此行为
  • @sqlchild:没有意见无济于事。 是的! 当然,您在 C# 中有事务 - 要么查看使用 SqlConnection 调用的 SqlConnection 开始的 SqlTransaction,要么查看 C# TransactionScope 构造
  • @sqlchild:不要做两次 - either 在 T-SQL 中做 - 总是,一直。在这种情况下,您可能正在使用存储过程,或者您的 SQL 语句都包含 BEGIN TRANSACTION....COMMIT 之类的东西。 或: 在您调用的 C# 代码中执行此操作。你需要选择一个并坚持一个。
  • 登录/权限与事务无关。登录/权限定义访问安全 - 用户是否允许登录,他可以在应用程序中做什么?交易是为了数据安全 - 确保您的数据更新“有意义”并且是完整的(或回滚)
  • @sqlchild:这是一种方法,如果您使用的是 ORM - 如果您不喜欢它,则需要创建一层视图(用于阅读)和存储过程(用于其他任何内容) 来抽象出你的数据库。工作,通常非常好 - 但需要更多的 T-SQL 编码。

标签: c# sql sql-server sql-server-2005


【解决方案1】:

您应该研究 C# 对事务的支持 - 比在您的系统中添加另一层(中介)更好的选择。

在 MSDN 上阅读所有相关信息 - Transactions and Concurrency in ADO.NET

基本上,在您的 SqlConnection 对象上,您有一个 .BeginTransaction 方法 - 使用它将对您的数据库的任何调用包装在事务中:

using(SqlConnection _con = new SqlConnection("your-conn-string-here"))
using(SqlCommand _cmd = new SqlCommand(queryStmt, _con))
{
    SqlTransaction sqlTran = _con.BeginTransaction();
    _cmd.Transaction = sqlTran;

    try
    {
       _con.Open();
       // do something, e.g. call _cmd.ExecuteNonQuery, or read a data reader

       sqlTran.Commit();
    }
    catch(Exception exc)
    {
        // log error
        sqlTran.Rollback();
    } 

    _con.Close();
}

【讨论】:

    【解决方案2】:

    SQL TRANSACTIONS 可以完全解决您的问题,无需任何中介。事务确保框架语句的操作在恢复方面是原子的。在 COMMIT 完成之前,事务不会触及实际数据。如果出现问题; ROLLBACK 语句终止当前事务并撤销在事务下所做的所有更改。

    此外,您可以为事务设置适当的隔离。事务隔离控制不同会话中事务之间更改的可见性。它确定一个会话中的查询是否可以看到另一个会话中的事务所做的更改。

    请阅读msdn reference了解更多交易信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-18
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多