-
[MySQL] SQL Error Explicit or implicit commit is not allowed in stored function or trigger데이터베이스/MySQL 2022. 1. 31. 18:56
MySQL 함수를 작성하다 마주친 에러와 구글링을 하며 알게 된 사실에 대해 짧게 기록해본다. 에러 발생 원인부터 말해보자면 함수 내에서 프로시저를 호출했기 때문이었고, 함수 대신 프로시저를 사용하여 에러를 해결했다.
에러 문구에 나와있듯 Stored function 또는 트리거 내에서는 commit이 허용되지 않는다. 즉 Stored function 내부에서는 트랜잭션 작업을 수행하면 안 된다. → Stored procedure와 차이점
Stored procedure와 Stored function 둘 다 사용하는 목적은 비슷한 것 같은데 왜 하나는 트랜잭션 작업이 허용되고 다른 하나는 트랜잭션 작업이 허용되지 않는지 궁금해졌다. 검색해보니 이와 같은 차이가 발생하는 요인은 Stored procedure는 "쿼리들을 캡슐화"할 때 사용하고, Stored function는 "쿼리 안에서 이용"하기 위해 사용하는 것이기 때문이었다. 쿼리는 atomic 한 연산이기 때문에 내부에 트랜잭션 작업이 존재할 수 없고, 쿼리 내에서 이용되는 함수에도 트랜잭션 작업이 존재할 수 없는 것이다.
그렇다면 프로시저와 함수는 각각 어떤 경우에서 사용하는 게 좋을까? 논리적인 흐름을 쿼리로 작성할 때는 Stored procedure를, 단순히 값/타입 변경이 목적이라면 Stored function을 사용하는 것이 좋다. (추가: 성능 측면에서 function은 가볍게 작성하는 게 좋다)
https://forums.mysql.com/read.php?98,409575,409805#msg-409805
'데이터베이스 > MySQL' 카테고리의 다른 글
[MySQL] Table Lock (feat. Deadlock 💀) (0) 2022.04.18 [MySQL] 테이블의 auto increment number 가져오기 (0) 2022.03.28 [MySQL] GROUP_CONCAT length 제한 (0) 2022.03.04 [MySQL] MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction (0) 2022.01.23 [MySQL] SUBSTRING_INDEX + REPLACE로 UPDATE 하려고 했다 (0) 2021.10.24