[java] MyBatis에서 데이터베이스 락 처리하기

데이터베이스의 일관성과 동시성을 보장하기 위해, 때로는 특정 행이나 테이블을 락(lock) 해야 할 때가 있습니다. MyBatis를 사용하는 경우, 데이터베이스 락 처리를 어떻게 할 수 있는지 알아보겠습니다.

1. SELECT문에서 락 사용하기

MyBatis에서 SELECT문을 실행할 때 락을 사용하려면, 다음과 같이 FOR UPDATE를 추가합니다.

<select id="getProduct" parameterType="int" resultType="Product">
  SELECT * FROM products WHERE id = #{id} FOR UPDATE
</select>

위의 코드에서 FOR UPDATE는 SELECT문을 실행할 때 해당 행을 락(lock)하도록 합니다. 이렇게 하면 다른 트랜잭션이 해당 행을 변경하지 못하게 합니다.

2. INSERT, UPDATE, DELETE문에서 락 사용하기

INSERT, UPDATE, DELETE문에서 락을 사용하려면, 다음과 같이 추가할 수 있습니다.

<insert id="createProduct" parameterType="Product">
  INSERT INTO products (name, price) VALUES (#{name}, #{price}) LOCK IN SHARE MODE
</insert>
<update id="updateProduct" parameterType="Product">
  UPDATE products SET price = #{price} WHERE id = #{id} LOCK IN SHARE MODE
</update>
<delete id="deleteProduct" parameterType="int">
  DELETE FROM products WHERE id = #{id} LOCK IN SHARE MODE
</delete>

위의 코드에서 LOCK IN SHARE MODE는 해당 행에 락을 설정하고, 다른 트랜잭션이 해당 행을 변경하지 못하게 합니다. 이렇게 함으로써 데이터의 일관성 유지가 가능합니다.

3. 두 개 이상의 테이블을 동시에 락 처리하기

MyBatis에서 두 개 이상의 테이블을 동시에 락 처리하려면, 다음과 같이 트랜잭션을 사용해야 합니다.

<transaction id="lockTables" isolationLevel="SERIALIZABLE">
  <content>
    LOCK TABLES table1 WRITE, table2 READ
    ...
    UNLOCK TABLES
  </content>
</transaction>

위의 코드에서 LOCK TABLESUNLOCK TABLES 사이에 락을 걸고자 하는 테이블을 명시합니다. WRITE는 해당 테이블에 쓰기 락을 걸고, READ는 해당 테이블에 읽기 락을 걸기 위해 사용됩니다.

참고 자료


이상으로 MyBatis에서 데이터베이스 락 처리하는 방법에 대해 알아보았습니다. 이를 통해 데이터베이스에 안전하고 일관된 처리를 할 수 있습니다.