Я пытаюсь понять и использовать пружинный уровень транзакционной изоляции. Мне нужно максимизировать параллелизм моего приложения, и мне просто нужно быть осторожным с грязным чтением. Призрачное чтение и другие сценарии действительно не требуются. Поэтому решил использовать Isolation.READ_COMMITTED для одного из наиболее используемых транзакционных методов моего приложения. Согласно весеннему документу:
Этот уровень запрещает транзакции только читать строку с незафиксированными изменениями в ней.
Итак, вот сценарий, с которым я столкнулся, который, я считаю, немного отличается от приведенного выше утверждения.
критический метод (customeId):
- Считать данные клиента из таблицы1
- принять какое-то решение
- добавить новую строку для этого клиента в table1
- продолжить длительную обработку .....
Таким образом, когда этот метод вызывается параллельно для двух совершенно независимых клиентов c1 и c2, если для c1 был на шаге 4, когда вызывается метод для c2. Так что мой вызов метода для блоков c2 на шаге 1 вызов метода для c1 заканчивается.
Я смоделировал этот сценарий с помощью отладки затмения. Я могу запрашивать данные со стороны моей базы данных на table1 для клиента c2. Согласно приведенной выше документации Spring, мой второй вызов метода не должен быть заблокирован.
Я что-то упустил?
Вот мой стек технологий:
- Java: 8
- Пружина: 4.3.7
- База данных: SqlServer 2012
- ORM: Mybatis 3.4.2
- mybatis spring version: 1.3.1