Compartir tecnología

Hay problemas de seguridad de subprocesos en la base de datos de operación del grupo de subprocesos

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Tabla de contenido

1. Introducción

2. Pregunta

3. Solución

3.1. Método 1: restricciones de la base de datos

3.2. Método 2: usar candados para restringir subprocesos

4. Resumen


1. Introducción

Los requisitos actuales son: procesar datos y almacenarlos en la base de datos. Durante el proceso de almacenamiento, primero consultará si los datos se han almacenado en la base de datos. Debido a que los datos a procesar son demasiado grandes, es necesario crear un grupo de subprocesos. Se utiliza para procesamiento simultáneo.

2. Pregunta

Al escribir lógica utilizando los métodos anteriores, habrá problemas de seguridad de subprocesos: la inserción durante la verificación (problema de inconsistencia de datos de consulta de base de datos), lo que resultará en la inserción repetida de datos. Por tanto, es necesario adoptar medidas para limitar el problema de la duplicación de datos.

3. Solución

3.1. Método 1: restricciones de la base de datos

Diseñe un campo en la base de datos como un índice único Incluso si el registro de datos correspondiente no se encuentra durante la consulta (en realidad ya existe en la base de datos), se informará una excepción de error de campo duplicado durante la inserción, lo que provocará que falle la inserción del registro de datos. Para lograr el problema de la deduplicación.

3.2. Método 2: usar candados para restringir subprocesos

Elija una estrategia de bloqueo adecuada basada en escenarios comerciales reales. El bloqueo optimista es adecuado para escenarios con menos conflictos de escritura y el bloqueo pesimista es adecuado para escenarios con más conflictos de escritura.

Sincronización de subprocesos: utilice mecanismos de sincronización comoReentrantLocksynchronized etc., para garantizar que solo un subproceso pueda realizar operaciones de consulta e inserción al mismo tiempo. Lo siguiente utiliza el mecanismo de sincronización de subprocesos y el diseño de visualización de código:

código de interfaz mybatis:

  1. import org.apache.ibatis.annotations.*;
  2. public interface UserMapper {
  3. @Select("SELECT COUNT(*) FROM user WHERE username = #{username}")
  4. int countByUsername(@Param("username") String username);
  5. @Insert("INSERT INTO user (username, password, email) VALUES (#{username}, #{password}, #{email})")
  6. @Options(useGeneratedKeys = true, keyProperty = "id")
  7. int insertUser(User user);
  8. }

Crear código de clase de servicio:

  1. import org.apache.ibatis.session.SqlSession;
  2. import org.apache.ibatis.session.SqlSessionFactory;
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.Executors;
  5. public class UserService {
  6. private final ExecutorService executorService;
  7. private final SqlSessionFactory sqlSessionFactory;
  8. public UserService(SqlSessionFactory sqlSessionFactory) {
  9. this.sqlSessionFactory = sqlSessionFactory;
  10. // 创建固定大小的线程池
  11. this.executorService = Executors.newFixedThreadPool(10);
  12. }
  13. public void addUser(User user) {
  14. executorService.submit(() -> {
  15. try (SqlSession session = sqlSessionFactory.openSession()) {
  16. UserMapper userMapper = session.getMapper(UserMapper.class);
  17. synchronized (UserService.class) {
  18. // 在同步块内执行查询和插入操作
  19. if (userMapper.countByUsername(user.getUsername()) == 0) {
  20. userMapper.insertUser(user);
  21. session.commit(); // 提交事务
  22. }
  23. }
  24. }
  25. });
  26. }
  27. }

Lo anterior es sólo un pequeño caso, el escenario de uso real depende de sus necesidades.Explique el código anterior: usandoUserService.class Como objeto de bloqueo para garantizar que solo un subproceso pueda realizar operaciones de consulta e inserción al mismo tiempo. Esto evita problemas de concurrencia, pero puede provocar cuellos de botella en el rendimiento, especialmente en escenarios de alta concurrencia. Puede considerar el uso de bloqueos más detallados o bloqueos a nivel de base de datos (como bloqueos pesimistas) para optimizar el rendimiento.

4. Resumen

La lógica de la base de datos de operación del grupo de subprocesos está diseñada de acuerdo con los requisitos, pero existen problemas de seguridad de subprocesos en todo el proceso. Por lo tanto, se presentan brevemente dos soluciones: ① Establecer campos de índice únicos en la tabla de la base de datos ② Usar bloqueo para garantizar la sincronización de subprocesos. Al usarlo, ajústelo de acuerdo con el escenario real. El proceso está escrito de manera relativamente amplia y solo se introducen dos métodos. Si desea comprenderlo en profundidad, debe estudiar más. Por supuesto, espero poder darte una pequeña respuesta a tu confusión a través de mis pequeños consejos.


La razón por la que tienes ganas de dormir cuando estudias es porque ahí es donde comienzan los sueños.
ଘ(੭ˊᵕˋ)੭ (feliz) ଘ(੭ˊᵕˋ)੭ (feliz) ଘ(੭ˊᵕˋ)੭ (feliz) ଘ(੭ˊᵕˋ)੭ (feliz) ଘ(੭ˊᵕˋ)੭ (feliz)
------Xiao Liu, que no será sobresaliente si no escribe código