背景简介:我们刚刚开始使用Hibernate将ERP系统迁移/重新实现为Java,目标是使用该系统的并发用户数为50-100。我们使用MS SQL Server作为数据库服务器,足以应付此负载。
现在,旧系统根本不使用任何交易,而是依靠关键部分(例如,库存变化)来设置(使用标志)手动锁定并释放它们。就像手动交易管理一样。但是有时数据不一致会出现问题。在新系统中,我们希望使用事务来消除这些问题。
现在的问题是:在OLTP和OLAP的使用率分别为85%和5%的情况下,对于ERP系统而言,使用哪种好/合理的默认事务隔离级别?还是我应该始终根据每个任务决定使用哪个交易级别?
并提醒您四个事务隔离级别:READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ,SERIALIZABLE
最佳答案
100次中的99次,读已提交是正确的答案。这样可以确保您仅看到其他 session 已提交的更改(因此,假设您已正确设计事务,则结果是一致的)。但这并没有施加可重复读取或可序列化施加的锁定开销(尤其是在非Oracle数据库中)。
有时,您可能希望运行一个报告,在该报告中您愿意牺牲准确性以提高速度并设置读取的未提交隔离级别。这很少是一个好主意,但有时它是锁定争用问题的合理可接受的解决方法。
当您的某个过程需要在整个运行过程中查看一致的数据集时,无论当时其他事务在做什么,都偶尔会使用可序列化和可重复读取。将月末对帐过程设置为可序列化可能是适当的,例如,如果过程代码很多,则用户可能在过程运行时进行更改,并且需要该过程确保在对帐开始时,它总是看到数据。