【问题标题】:Transaction Isolation level different threads massive number of Writes事务隔离级别不同线程大量写入
【发布时间】:2014-10-23 07:09:36
【问题描述】:

我有很多线程将两个表中的一些数据写入数据库。 tbl_raw_datatbl_parsed_data,其中 tbl_parsed_data 具有 tbl_raw_data 的外键。

我还需要写得非常快。

在检查改进写入的选项时(假设阅读时间非常重要),我的一个朋友告诉我,我需要检查适合我的逻辑的事务隔离级别。 在阅读了一些关于这个问题的文章后,我了解到这个属性会影响阅读。

是否存在影响写入的事务隔离级别?对于在大量连接上运行的大量线程来说,哪种隔离级别是“最佳”的?

我是不是找错地方了?

我可以做些什么来提高大量写作?

我正在使用 SQL 服务器,线程来自 TomEE 服务器,该服务器写入通过 HTTP 请求而来的数据。

【问题讨论】:

    标签: sql-server transactions bulkinsert isolation-level


    【解决方案1】:

    隔离级别确实不影响写入。无论如何,锁定在大多数情况下对性能的影响可以忽略不计(除非您阻止)。你正在思考一个没有成果的方向。为了让自己相信这一点,请将服务器置于负载下并使用 PerfView 对其进行分析。 SQL Server 的大部分代码将用于(反)序列化数据。

    研究 SQL Server 中众所周知的批量插入技术。来自基本上是SqlBulkCopy 的客户。在服务器上,它将是具有大量批处理的 INSERT 语句(或只有一个这样的语句)。

    事务通常会提高性能,因为它们允许(不可避免的)日志写入被延迟和批处理。

    【讨论】:

      【解决方案2】:

      你说得对,这个属性会影响阅读。

      但需要注意的是,它会为读取、写入不同级别的行、表级别等创建不同的锁。锁的问题是它们会消耗资源并大大降低速度。根据您的要求,如果您不介意“脏读”、“不可重复读”和“幻读”,您可以将隔离级别设置为“未提交读”

      我不能保证确切的性能改进,但对于大型并行连续读/写数据,它肯定应该是默认设置的至少 10 倍。

      还有另一种看待问题的方法:

      有时如果有连续的多个并发请求进来,您的数据库就会有过多的负载。您仍然可以根据您的要求进行设计(在设计中始终必须考虑读取)。有效的解决方案一直是批处理。

      • 您始终可以从多个请求中收集数据并批量运行事务。这样,该特定隔离级别的速度会更快。
      • 您真的需要交易吗?同意您有外键关系,但您始终可以先提交 tbl_raw_data 行,然后提交 tbl_parsed_data 行数据。

      【讨论】:

      • 读取未提交对写入锁没有影响。引擎需要写锁来保证回滚。
      • 我并不是说要使用隔离级别,它始终是基于需求的设计。
      • 它仍然是一个事务,即使它是一个“未提交读取”隔离级别,所以它应该能够根据事务的定义“回滚”。
      • 那个“定义”是通过无法关闭的锁来实现的。
      猜你喜欢
      • 1970-01-01
      • 2011-09-30
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-14
      • 2013-08-27
      • 2020-06-07
      相关资源
      最近更新 更多