- node mysql에서는 트랜젝션을 제공한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | connection.beginTransaction(function(err) { var post = { m_tel: '010-1234-5678', m_id: 'GilDong2', m_pass: 'password1', m_name: '이순신', m_date: '2000-01-01', m_gender: '남', m_email: 'GilDong@Hong.com' }; if (err) { throw err; } connection.query('INSERT INTO member SET ?', post, function(err, result) { console.log(result); if (err) { connection.rollback(function() { console.log("1.error"); throw err; }); } //실행된 결과가 0일경우 connection.query('update member set m_gender = ? where m_name = ?', ['여','강감찬'], function(err, result) { console.log(result); if (!result.affectedRows) { connection.rollback(function() { console.log("2.error"); }); } connection.commit(function(err) { if (err) { connection.rollback(function() { throw err; }); } console.log('success!'); }); }); }); }); |
- 주요코드는 beginTransaction(), rollback(), commit() 이다.
- beginTransaction으로 감싼 부분이 트렉젝션이 적용된다.
- 쓰기에 따라서, 8번라인처럼 err가 발생했을경우, 또는 17번라인처럼 해당쿼리의 결과에 따른 경우에 따라서 rollback을 실행시키면된다. 만약 중간에 rollback이 실행된다면 이전의 처리는 모든게 무효화 될것이다.
- Transaction의 마지막 부분에 있어서 commit을 해줌으로서 모든 결과를 완료한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | { fieldCount: 0, affectedRows: 1, insertId: 0, serverStatus: 3, warningCount: 0, message: '', protocol41: true, changedRows: 0 } { fieldCount: 0, affectedRows: 0, insertId: 0, serverStatus: 35, warningCount: 0, message: '(Rows matched: 0 Changed: 0 Warnings: 0', protocol41: true, changedRows: 0 } 2.error success! |
- 위 코드의 결과이다. 결과값에서의 위쪽 쿼리에서의 처리된 row가 1, 아래의 쿼리에서의 처리된 row는 0으로서 본문코드의 18번에 해당되어 Rollback이 진행되었다.
- result의 affrectedRows는 처리된 레코드의 수를 반환한다.
- 2error 발생 확인.
- 먼저 처리한쿼리(insert)의 결과는 1이므로 적용이 됬어야하지만, 트렌젝션으로 묶여있는 아래쿼리에서 롤백이 일어나 insert됬던 결과가 무효화 되었음을 확인하였다.
- 기존에 1레코드 있었음
댓글 없음:
댓글 쓰기