2021. 1. 3. 23:43ใ๐๐ปโ๏ธ Study/โ๏ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ( Database )
ํธ๋ ์ญ์ ์ด๋(Transaction) ?!
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํ๋ฅผ ๋ณํ์ํค๋ ํ๋์ ๋ ผ๋ฆฌ์ ๊ธฐ๋ฅ์ ์ํํ๊ธฐ ์ํ ์์ / ํ๊บผ๋ฒ์ ์ํ๋์ด์ผํ ์ผ๋ จ์ ์์ ์ฐ์ฐ์ ์๋ฏธํ๋ค.
์ฌ๋ฌ ์ค์ SQL ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๋ ์ฅ์ ๊ฐ ๋ฐ์ํ์ ๊ฒฝ์ฐ , ์ฟผ๋ฆฌ ์ ์ฒด๋ฅผ ์ทจ์(rollback) ํ๊ฑฐ๋ ํ์ (commit)ํ๋ ์ฐ์ฐ(์์์ฑ์ ํด๋น)์ ํ๋ฉฐ
๋ณดํต RDBMS์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํ๋ RDBMS์ ๊ฐํ ๊ธฐ๋ฅ์ด๋ผ๊ณ ๋งํ ์ ์๋ค.
ํธ๋์ญ์ ์ ACID ํน์ฑ
- ์์์ฑ(Atomicity)
- ์ผ๊ด์ฑ(Consistency)
- ๊ฒฉ๋ฆฌ์ฑ(Isolation)
- ๋ด๊ตฌ์ฑ(Durability)
MySQL(InnoDB)์ ํธ๋์ญ์
MySQL์ ๊ธฐ๋ณธ ์คํ ๋ฆฌ์ง ์์ง์ ' InnoDB'์ด๋ค.
MySQL์ InnoDB ์์ง์ ๊ธฐ๋ณธ ์ค์ ์ด ํธ๋์ญ์ ์ด ๋ฏธ์ง์ ์ํ์ด๋ค.
์๋ํ๋ฉด autocommit๋ชจ๋ (์ค ๋จ์ ์ปค๋ฐ)์ด ์ผ์ ธ์๋ ์ํ์ด๊ธฐ ๋๋ฌธ์ ํธ๋์ญ์ ์ด ๋ฏธ์ง์ ์ํ์ด๋ค.
ํธ๋์ญ์ ์ ์ฌ๋ฌ์ค์ด ์คํ๋๋ค๊ฐ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ๋ค ์ทจ์๊ฐ ๋๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ autocommit ๋ชจ๋์์๋ ํธ๋์ญ์ ์ด ์ํ ๋ถ๊ฐ๋ฅํ๋ค!
ํธ๋์ญ์ ์ด ์ง์๋๊ฒ ํ๋ ค๋ฉด ๊ธฐ๋ณธ ์ค์ ์ autocommit ๋ชจ๋๋ฅผ 'False'๋ก ๋ณ๊ฒฝํด์ผํ๋ค!
ํธ๋์ญ์ ์ค์ต
โ๏ธauto commit - false๋ก ๋ณ๊ฒฝํ๊ธฐ
show variables like '%commit%'; // commit ๋ชจ๋ ํ์ธํ๊ธฐ
set autocommit=0; // autocommit๋ชจ๋ false๋ก ๋ณ๊ฒฝ
show variables like '%commit%';
MySQL InnoDB์ ๊ธฐ๋ณธ์ autocommit ON ์ํ์ด๋ค. ํธ๋์ญ์ ์ค์ต์ ํ๋ ค๋ฉด autocommit ๋ชจ๋๋ฅผ False๋ก ๋ณ๊ฒฝํด์ผํ๋ค.
โ๏ธCommit / Rollback ์ค์ต
Commit - SQL๋ฌธ ์คํ์ ํ์ ์ง๋ ๊ฒ ( SQL๋ฌธ ์คํ ํ ๋ณ ๋ฌธ์ ์์ผ๋ฉด commit ์ํํ๋ค.)
Rollback - ๋ง์ง๋ง Commit ์ด์ ์ํ๋ก ๋์๊ฐ๋ ๊ฒ (๋ง์ง๋ง Commit ์ดํ์ ์คํ๋์๋ ๊ฒ๋ค์ ๋ชจ๋ ์ทจ์๋๋ค.)
use employees;
insert into employees values (1000, '2021-01-03', 'yunakim1', 'kim1', 'F', '2021-01-01');
select * from employees where emp_no=1000;
rollback;
select * from employees where emp_no=1000;
Commit์ ํ์ง์์๊ธฐ ๋๋ฌธ์ SQL๋ฌธ์ด rollbackํ select๋ฌธ ๊ฒฐ๊ณผ์ ์ฌ๋ผ์ง ๊ฒ์ ํ์ธํ ์ ์๋ค!
insert into employees values (2000, '2021-01-01', 'yunakim2', 'kim2', 'F', '2021-01-01');
select * from employees where emp_no = 2000;
commit;
rollback;
select * from employees where emp_no=2000;
SQL๋ฌธ์ด commit ๋์ด rollback ํ select ๋ฌธ ๊ฒฐ๊ณผ๋ก ํ์ธํ ์ ์๋ค!
โ๏ธSavePoint ์ค์ต
SavePoint๋?
- rollback์ ํธ๋์ญ์ ์ ์์์ด ์๋ savepoint๊น์ง rollbackํ๋ค.
- ์ฌ๋ฌ ๊ฐ์ savepoint๋ฅผ ์์ฑํ ์ ์๋ค.
- ์คํ ๋ฆฌ์ง ์์ง์ ๋ฐ๋ผ ์๋์ฌ๋ถ๊ฐ ๋ค๋ฅด๋ค
insert into employees values (3000, '2021-01-04', 'yunakim3', 'kim3', 'F', '2021-01-04');
savepoint A;
insert into employees values (4000, '2021-01-05', 'yunakim4', 'kim4', 'F', '2021-01-05');
rollback to A;
select * from employees where emp_no = 3000;
select * from employees where emp_no = 4000;
๋ง์ง๋ง Commit ์ง์ ์ SavePoint A๋ก ์ง์ ํ์ฌ Rollback์์ savepoint๊น์ง commit๋ ์ํ๋ก ๋๋๋ฆด ์ ์๋ค.
JDBC ํธ๋์ญ์ ์ค์ต
JDBC ์ค์ต์ ๊ดํ ์ค์น๋ฒ ๋ฐ ์ฌ์ฉ๋ฒ์ ๋ํด์๋ ์๋ ๊ธ์ ๋ณด๊ณ ์ค์๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค!
โ๏ธubuntu ์คํ
docker exec -it ubuntu_new1 bash
โ๏ธtomcat8 ์๋ฒ ์ด๊ธฐ
cd /usr/share/java
service tomcat8 start
โ๏ธ tomcat8 ํ์ผ๋ก์ด๋ํ๊ธฐ
cd /var/lib/tomcat8/webapps/ROOT
โ๏ธ ํธ๋์ญ์ ์ค์ต ๊ด๋ จ JDBC jsp ์์ฑํ๊ธฐ
nano sample.jsp
<%@ page import = "java.sql.*" %>
<% Class.forName("com.mysql.jdbc.Driver");
String dbUrl = "jdbc:mysql://172.17.0.2:3306/employees";
Connection con = DriverManager.getConnection(dbUrl, "root","yunas");
try {
con.setAutoCommit(false);
Statement stmt = con.createStatement();
Savepoint savepoint1 = con.setSavepoint("Savepoint1");
String SQL = "insert into employees values (1000,'2020-01-03','yuna1','kim1','F','2020-01-03');";
stmt.executeUpdate(SQL);
con.commit();
String SQL2 = "inserted into employees values (2000,'2020-01-04','yuna2','kim2','F','2020-01-04');";
stmt.executeUpdate(SQL2);
con.commit();
out.println("record adding Success!");
} catch (SQLException e) { out.println("ERROR!");
out.println(e);
con.rollback();
} finally {
con.setAutoCommit(true);
}
โ๏ธ์คํ๊ฒฐ๊ณผ
localhost:8080/sample.jsp
SQL2 ๋ฌธ์ฅ์์ SQL syntax์ ์ํด Error ๊ฐ ๋ฐ์ํ ๊ฒ์ ์์์๋ค!
์ ๋ฒ JDBC ์ค์ต์์ ๋ง๋ค์๋ statement.jsp ๋ฅผ ํตํด ์ฒซ๋ฒ์งธ SQL๋ฌธ์ ์ฌ๋ฐ๋ฅด๊ฒ insert๋ ๊ฒ์ ํ์ธํ ์ ์๋ค!
'๐๐ปโโ๏ธ Study > โ๏ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ( Database )' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Transaction Isolation (ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ์ฑ) (0) | 2021.01.10 |
---|---|
[Docker/MySQL] JDBC - PreparedStatement ์ค์ต (2) | 2020.12.31 |
[Docker/MySQL] JDBC - Statement ์ค์ต (0) | 2020.12.31 |