PyMySQL autocommit ์„ค์ •ํ•˜๊ธฐ ๐Ÿค”

yeeun leeยท2020๋…„ 6์›” 2์ผ
1

flask

๋ชฉ๋ก ๋ณด๊ธฐ
1/5

pymysql์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— data๋ฅผ insertํ•  ๋•Œ, ๋งŒ์•ฝ connection์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๋‹ค๊ฐ€ ๋Š๊ธฐ๋Š” ์ƒํ™ฉ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

ORM์„ ์“ธ ๋•Œ์—๋Š” ์‚ฌ์‹ค ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•˜๋˜ ๋ถ€๋ถ„์ธ๋ฐ, ๋ชจ๋“  endpoint๋ฅผ ๋งŒ๋“ค ๋•Œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ƒ๊ฐ๋ณด๋‹ค ์—„์ฒญ ์ค‘์š”ํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ์•˜๋‹ค. (์ค‘๋ณต ๋ฐ์ดํ„ฐ, ํ˜น์€ ๋ฐ˜์ชฝ์งœ๋ฆฌ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—)

์ค‘์š”ํ•œ ๋ฌธ์ œ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

SET AUTOCOMMIT = FALSE;

mysql์— ์ ‘์†ํ•ด์„œ auto-commit์„ offํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๋ฌธ์ œ๋Š” auto-commit์€ ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‚ด๊ฐ€ ๋„๋”๋ผ๋„ ๋‹ค์‹œ on์ด ๋œ๋‹ค.

show variables like 'autocommit%'; # ์„ค์ • ํ™•์ธ
SET AUTOCOMMIT = TRUE;  # ์ž๋™ ์ €์žฅ ์„ค์ •
SET AUTOCOMMIT = FALSE; # ์ž๋™ ์ €์žฅ ํ•ด์ œ

์‹ค์ œ๋กœ ๊ตฌ๊ธ€๋ง์„ ํ•ด์„œ ์œ„์ฒ˜๋Ÿผ mysql ์„ค์ •์„ ๋„๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ƒˆ์ง€๋งŒ, mysql์„ ์ข…๋ฃŒํ•˜๊ณ  ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด ์„ค์ •์€ off -> on์œผ๋กœ ๋ณ€ํ•ด์žˆ๋‹ค ๐Ÿ˜ญ

๋งํฌ์˜ ์„ค๋ช…์„ ๋ณด๋ฉด,

InnoDB์—์„œ๋Š” ๋ชจ๋“  ์œ ์ €์˜ ํ–‰๋™์ด ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ๋ฐœ์ƒํ•˜๊ณ , autocommit์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์„ ๋•Œ ๊ฐ๊ฐ์˜ SQL statement๋Š” ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์„ ๋งŒ๋“ค๊ฒŒ ๋œ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ MySQL ์€ ์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ์— ๋Œ€ํ•ด autocommit์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์—์„œ ์„ธ์…˜์„ ์‹œ์ž‘ํ•œ๋‹ค.
๊ทธ๋ž˜์„œ ํ•˜๋‚˜์˜ statement๊ฐ€ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๋Š” ์ด์ƒ SQL statement ํ•˜๋‚˜๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ๋‚ด์šฉ์„ ์ €์žฅํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

DAO Cursor๋งˆ๋‹ค SQL statement ์‹คํ–‰

๋‚ด๊ฐ€ ์•„๋ฌด๋ฆฌ mysql์—์„œ ์„ค์ •์„ ๋ฐ”๊ฟ”๋ดค์ž ์„ธ์…˜์ด ๋๋‚  ๋•Œ๋งˆ๋‹ค ์„ค์ •์€ ๋‹ค์‹œ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜์–ด์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋งค DAO ๋งˆ๋‹ค auto commit์„ false๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” SQL statement๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๋„ ์ƒ๊ฐํ•ด๋ณด์•˜๋‹ค.

cursor.execute์—์„œ set autocommit = false๋ฅผ ์‹คํ–‰ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

DB connection ์„ค์ • ๋ฐ”๊พธ๊ธฐ

์‚ฌ์‹ค ์œ„์˜ ์„ค์ •๋“ค์€ ์‚ฝ์งˆ์„ ํ•˜๋‹ค๊ฐ€ ์–ป์–ด๋‚ธ ๊ฒฐ๊ณผ์ด๊ณ , ๊ฒฐ๋ก ์ ์œผ๋กœ๋Š” db connection์—์„œ parameter๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค.... ใ…Žใ…Žใ…Ž

๋งํฌ์— ๋“ค์–ด๊ฐ€๋ณด๋ฉด connection object๊ฐ€ ๋‚˜์™€์žˆ๋‹ค. ๋‚ด db ๊ด€๋ จ ์„ค์ •์„ ์ €์žฅํ•˜๋Š” ํŒŒ์ผ์—์„œ autocommit์„ false๋กœ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

์‚ฌ์‹ค ์ด๋ ‡๊ฒŒ ํ•ด๋„ ์–ด๋–ค ์ปดํ“จํ„ฐ์—์„œ๋Š” ๋˜๊ณ  ์–ด๋–ค ์ปดํ“จํ„ฐ์—์„œ๋Š” ์•ˆ ๋ผ์„œ ๋˜ ๋‚œํ•ญ์„ ๊ฒช์—ˆ์ง€๋งŒ... ์šฐ์„  db_connection์ด ์žˆ์„ ๋•Œ ์˜ˆ์™ธ๋ฅผ ๋งŒ๋‚˜๋ฉด rollbackํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋กœ์ง์„ ์งœ๊ณ  ์žˆ๋‹ค ๐Ÿ˜

db = {
        'user' : 'root',
        'password' : '',
        'host' : 'localhost',
        'port' : '3306',
        'database' : 'brandiv1',
        'charset' : 'utfmb4',
        'autocommit' : False
        }
profile
์ด์‚ฌ๊ฐ„ ๋ธ”๋กœ๊ทธ: yenilee.github.io

0๊ฐœ์˜ ๋Œ“๊ธ€