Database/SQL

[MySQL] SQLSyntaxErrorException: MySQL์—์„œ์˜ SELECT FOR UPDATE WAIT N ๊ตฌ๋ฌธ ์‚ฌ์šฉ

์ฑ”๐Ÿป 2024. 2. 9. 20:34

โœ”๊ฒฐ๋ก 

MySQL์—์„œ๋Š” Oracle์— ์žˆ๋Š” SELECT FOR UPDATE WAIT N ๊ตฌ๋ฌธ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋Œ€์‹  NOWAIT & SKIP LOCKED ์˜ต์…˜์ด ์กด์žฌํ•œ๋‹ค.

๐Ÿ‘€๋ฌธ์ œ ์ •์˜

MySQL์—์„œ SELECT FOR UPDATE WAIT 3 ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉ ์‹œ SQLSyntaxErrorException ์˜ค๋ฅ˜ ๋ฐœ์ƒ.

์ด ๊ตฌ๋ฌธ์€ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ๋ฝ์„ ๊ฑธ๊ณ  ์žˆ์„ ๊ฒฝ์šฐ, ์ง€์ •๋œ ์‹œ๊ฐ„(์˜ˆ: 3์ดˆ) ๋™์•ˆ ์žฌ์‹œ๋„๋ฅผ ์‹œ๋„ํ•˜๊ณ , ๊ทธ ์‹œ๊ฐ„ ์•ˆ์— ๋ฝ์„ ์–ป์ง€ ๋ชปํ•˜๋ฉด ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์˜ต์…˜์ด๋‹ค.

java.sql.SQLSyntaxErrorException Create breakpoint : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax t se near 'WAIT 3' at line 7

โ“ย ์›์ธ ์ถ”๋ก  & ํ•ด๊ฒฐ์ฑ… ์‹œ๋„

  1. ์ด์ „์— ์ฟผ๋ฆฌ๋ฌธ์— ์ฃผ์„(โ€™#โ€™)์ด ํฌํ•จ๋œ ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ ๋ฐœ์ƒ๋˜๋Š” ์˜ค๋ฅ˜ ๋•Œ๋ฌธ์— ๋น„์Šทํ•œ ์ด์œ ๋กœ ๋ฐœ์ƒ๋˜๋Š” ๋ฌธ์ œ์ธ๊ฐ€ ์‹ถ์—ˆ๋‹ค. ์ƒ๊ฐ์„ ๋˜์งš์–ด๋ดค์„ ๋•Œ MySQL โ†’ Oracle ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•œ๋‹ค๊ณ  ์˜ค๋ผํด ์˜์กด์„ฑ ์ถ”๊ฐ€ํ•œ๋’ค๋กœ๋ถ€ํ„ฐ ์•ˆ ๋์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ž˜์„œ ์˜์กด์„ฑ ์ถฉ๋Œ๋กœ์ธํ•œ ๋ฌธ์ œ์ธ๊ฐ€ ์‹ถ์–ด ์—ฌ๋Ÿฌ ์‹œ๋„๋ฅผ ํ•ด๋ณด์•˜๋‹ค.
    • ๊นƒ ํ—ค๋“œ๋ฅผ ์˜ค๋ผํด ์˜์กด์„ฑ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์—” 1/8๋กœ head ์˜ฎ๊ธฐ๊ธฐ โ†’ # ์ฃผ์„์žˆ์–ด๋„ ์‹คํ–‰ ์ž˜๋จ
    • ์˜์กด์„ฑ ์ถ”๊ฐ€ํ•œ ๋‚ ์ธ 1/13์ผ ๋ฒ„์ „ โ†’ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž˜๋จ
    • ์›๋ž˜ ๋ฒ„์ „์œผ๋กœ ๋Œ๋ ค๋ณด์•˜๋Š”๋ฐ ๊ฐ‘์ž๊ธฐ โ€˜#โ€™ ์ฃผ์„์ด ํฌํ•จ๋˜์–ด์žˆ์–ด๋„ ์ž˜ ๋œ๋‹ค???
  1. โŒย ์˜ค๋ผํด ์˜์กด์„ฑ (pom.xml) ์ง€์›Œ๋ณด๊ธฐ
  1. โŒย MySQL 8.0 ๋ฒ„์ „๋ถ€ํ„ฐ SELECT FOR UPDATE์˜ ์ œ์–ด ์˜ต์…˜๋“ค์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค๊ณ  ํ•ด์„œ ํ˜น์‹œ๋‚˜ํ•ด์„œ ๋ฒ„์ „๋„ ํ™•์ธํ•ด๋ณด์•˜์œผ๋‚˜ 8๋ฒ„์ „์ด ๋งž๋‹ค.
    SELECT version();
  1. โœ…ย ํ˜น์‹œ๋‚˜ํ•ด์„œ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์ฝ˜์†”์— ๋‚ ๋ ค๋ณด์•˜๋‹ค.

    ์ฝ˜์†”์—์„œ ์—๋Ÿฌ ๋ฐœ์ƒ..!

๐Ÿ”ย ์›์ธ

์›์ธ์€ MySQL์ด Oracle๊ณผ ๊ฐ™์ด WAIT N ๊ตฌ๋ฌธ์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค. RealMySQL ์ฑ…๊ณผ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ†ตํ•ด NOWAIT & SKIP LOCKED ์˜ต์…˜์€ ์ง€์›ํ•˜์ง€๋งŒ, ํŠน์ • ์‹œ๊ฐ„ ๋™์•ˆ ๋Œ€๊ธฐ ํ›„ ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” WAIT N ์˜ต์…˜์€ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

MySQL :: MySQL 8.0 Reference Manual :: 17.7.2.4 Locking Reads
If you query data and then insert or update related data within the same transaction, the regular SELECT statement does not give enough protection. Other transactions can update or delete the same rows you just queried. InnoDB supports two types of locking reads that offer extra safety:
https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html

๐Ÿ”œย ๋‚˜๊ฐ€๋ฉฐ

MySQL๊ณผ Oracle์˜ ๋ฌธ๋ฒ• ์ฐจ์ด์ ์„ ์ธ์ง€ํ•˜๊ณ , ๊ตฌ๋ฌธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ํ•ด๋‹น DBMS์—์„œ ์ง€์›ํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค.

Ref

MySQL :: MySQL 8.0 Reference Manual :: 17.7.2.4 Locking Reads
If you query data and then insert or update related data within the same transaction, the regular SELECT statement does not give enough protection. Other transactions can update or delete the same rows you just queried. InnoDB supports two types of locking reads that offer extra safety:
https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html
Real MySQL 8.0 (2๊ถŒ) - ์˜ˆ์Šค24
ใ€ŽReal MySQL 8.0ใ€์€ ใ€ŽReal MySQLใ€์„ ์ •์ œํ•ด์„œ ๊ผญ ํ•„์š”ํ•œ ๋‚ด์šฉ์œผ๋กœ ์••์ถ•ํ•˜๊ณ , MySQL 8.0์˜ GTID์™€ InnoDB ํด๋Ÿฌ์Šคํ„ฐ ๊ธฐ๋Šฅ๋“ค๊ณผ ์†Œํ”„ํŠธ์›จ์–ด ์—…๊ณ„ ํŠธ๋ Œ๋“œ๋ฅผ ๋ฐ˜์˜ํ•œ GIS ๋ฐ ์ „๋ฌธ ๊ฒ€์ƒ‰ ๋“ฑ์˜ ํ™•์žฅ ๊ธฐ๋Šฅ๋“ค์„ ์ถ”๊ฐ€๋กœ ์ˆ˜๋กํ–ˆ๋‹ค. ๋˜ํ•œ ใ€ŽRe...
https://m.yes24.com/Goods/Detail/103415767

Uploaded by N2T