sql - ERP的最佳默认事务隔离级别是多少?

Translate

背景简介:我们刚刚开始使用Hibernate将ERP系统迁移/重新实现为Java,目标是使用该系统的并发用户数为50-100。我们使用MS SQL Server作为数据库服务器,足以应付此负载。

现在,旧系统根本不使用任何交易,而是依靠关键部分(例如,库存变化)来设置手动锁定(使用标志)并释放它们。就像手动交易管理一样。但是有时数据不一致会出现问题。在新系统中,我们希望使用事务来消除这些问题。

现在的问题是:什么是好的/合理的默认考虑到大约85%的OLTP和15%的OLAP,ERP系统使用的事务隔离级别?还是我应该始终根据每个任务决定使用哪个交易级别?

并提醒您四个事务隔离级别:READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ,SERIALIZABLE

This question and all comments follow the "Attribution Required."

所有的回答

Translate

100次中的99次,读已提交是正确的答案。这样可以确保您仅看到其他会话已提交的更改(因此,假设您已正确设计事务,则结果是一致的)。但这并没有施加可重复读取或可序列化施加的锁定开销(尤其是在非Oracle数据库中)。

有时,您可能希望运行一个报告,在该报告中您愿意牺牲准确性以提高速度并设置读取的未提交隔离级别。这很少是一个好主意,但有时它是锁定争用问题的合理可接受的解决方法。

当您的某个过程需要在整个运行过程中查看一致的数据集时,无论当时其他事务在做什么,都偶尔会使用可序列化和可重复读取。将月末对帐过程设置为可序列化可能是适当的,例如,如果过程代码很多,则用户可能在过程运行时进行更改,并且需要该过程确保在对帐开始时,它总是看到数据。

来源
Translate

不要忘了SNAPSHOT,它位于SERIALIZABLE下方。

这取决于报告中数据准确的重要性。这确实是一项逐项任务的事情。

来源
Translate

这实际上很大程度上取决于您如何设计应用程序,简单的答案就是在READ_COMMITTED上运行。

您可以提出一个论点,即如果您在设计系统时考虑到这一点,则可以使用READ_UNCOMMITTED作为默认值,并且仅在需要时才增加隔离级别。无论如何,您的绝大多数交易都将成功,因此读取未提交的数据不会有什么大不了的。

隔离级别影响查询的方式取决于目标数据库。例如,在运行READ_COMMITTED时,Sybase和MSSQL之类的数据库必须比Oracle之类的数据库锁定更多的资源。

来源
Translate

对于SQL Server(可能是大多数主要的RDBMS),我坚持使用默认值。对于SQL Server,这是READ COMMITTED。太多了,您就会开始使数据库负担沉重,少了些,您就会遇到一致性问题。

来源
Translate

在大多数论坛中,阅读未提交绝对是失败者。但是,使用它的原因超出了通常指出的“速度与准确性”的范围。

假设您有:

  • 事务T1:写B,读A,(还有一些工作),提交。
  • 事务T2:写入A,读取B,(还有一些工作),提交。

提交读操作后,上述事务直到提交后才会释放。然后,您可能会遇到以下情况:T1等待T2释放A,而T2等待T1释放B。这两个事务在一个锁中碰撞。

您可以重新编写这些过程以避免这种情况(例如:始终按字母顺序获取资源!)。但是,由于并发用户太多和成千上万的代码行,此问题很可能变得非常难以诊断和解决。

替代方法是使用未提交读。然后,假设可能存在脏读,则设计事务。我个人发现,这个问题比联锁的火车残骸更具局限性和可治疗性。

脏读引起的问题可通过

  • (1)回滚:不。仅在出现硬件故障,网络故障或程序崩溃的情况下,这应该是最后一道防线。

  • (2)使用应用程序锁创建一种锁定机制,该机制在更高的抽象级别上运行,其中每个锁都更接近于实际资源或操作。

来源
Leave a Reply
You must be logged in to post a answer.
关于作者