首页 > 解决方案 > C#/SQL Server:如何在允许另一个用户无缝访问数据的同时重复锁定/截断/更新表

问题描述

我是一个有锁定/更新类型问题的新手。

我有需要不断截断表和刷新的市场类型数据。

如果我有代码:

//...fetch some data into dtable1...
// Below: Truncates existing sql table 'table1' & then bulkcopies dtable1 into 'table1'

SqlConnection _con = new SqlConnection();

using (_con = new SqlConnection(servername))
{
   SqlCommand sqlTruncate = new SqlCommand("TRUNCATE TABLE table1;", _con);
   sqlTruncate.ExecuteNonQuery();
   _con.Close();
}

using (var bulkCopy = new SqlBulkCopy(_con.....)
{
    bulkCopy.BulkCopyTimeout = 500;
    bulkCopy.DestinationTable = "table1";
    bulkCopy.WriteToServer(dtable1);
}

我如何/在哪里将锁或其他东西放在 Truncate & Bulkcopy 周围,以便另一个用户可以随时无缝调用“table1”......所以我想如果 Truncate AND Bulkcopy 尚未完成,用户调用数据会优先获得“table1” ' 数据和用户调用数据之后获取新数据而不会由于更新之间的数据丢失或部分丢失?

谢谢!

标签: c#sql-server

解决方案


我现在用 TB 大小的数据库编写交易系统大约 22 年,这是我的 2 美分。

  1. 设置事务快照并确保你有一个快速的 temptdb

  2. 对表进行分区以减少锁定范围并将过去的分区设置为只读,以便数据库知道“过去”数据是稳定的。

  3. 将连接应用程序连接字符串 ApplicationIntend 设置为只读的那些读取,和读写那些更新数据

  4. 删除不需要的索引,填充您确实需要的那些索引

  5. 确保以自然附加新行的方式对索引进行排序,将索引视为表,在索引“数据表”中插入和维护顺序实际上可能比插入实际数据花费的时间更长。

  6. 确保您使用正确的数据类型,抱怨 2 个不是 100% 相同的数据类型将导致 SQL 创建一个强制转换函数并显着减慢活动速度。

  7. 在您的代码缓冲区数据中并尽可能多地使用缓冲数据

  8. 使用分析器记录所有查询并确保您没有生成与数据类型不匹配的参数(参见 6),一些框架将使用 VarChar(max) 或 NVarchar(max),这不是预期的。

  9. 确保你的 SQL 不是连接你不需要的表,连接是一个锁,锁比存储太多数据更糟糕,找到一个平衡点。

  10. 开箱即用,有时您需要将数据水平分区并将其存储在第二台服务器上,特别是如果不相关,例如纳斯达克和香港。

  11. 使用不同的数据库进行报告,例如对任何不重要的内容使用只读快照。您也可以将备份文件用作只读数据库,不确定您是否知道这一点。

  12. 至于临时表中的 ETL 转储数据并将数据从“着陆区”移动到“活动区”,正常的 ETL 模式适用,谷歌“滑动窗口”用于大量


推荐阅读