MySql 사용 - 트랜잭션

MySql 트랜잭션

복수 개의 SQL 문을 하나의 트랜잭션으로 묶기 위하여 sql.DB의 Begin() 메서드를 사용한다. 트랜잭션은 복수 개의 SQL 문을 실행하다 중간에 어떤 한 SQL문에서라도 에러가 발생하면 전체 SQL문을 취소하게 되고 (이를 롤백이라 한다), 모두 성공적으로 실행되어야 전체를 커밋하게 된다. sql.Tx 타입의 Begin() 메서드는 sql.Tx 객체를 리턴하는데, 마지막에 최종 Commit을 위해 Tx.Commit() 메서드를, 롤백을 위해 Tx.Rollback() 메서드를 호출한다.

package main

import (
	"database/sql"
	"log"

	_ "github.com/go-sql-driver/mysql"
)

func main() {
	// sql.DB 객체 생성
	db, err := sql.Open("mysql", "root:pwd@tcp(127.0.0.1:3306)/testdb")
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	// 트랜잭션 시작
	tx, err := db.Begin()
	if err != nil {
		log.Fatal(err)
	}
	defer tx.Rollback() //중간에 에러시 롤백

	// INSERT 문 실행
	_, err = db.Exec("INSERT INTO test1 VALUES (?, ?)", 15, "Jack")
	if err != nil {
		log.Fatal(err)
	}

	_, err = db.Exec("INSERT INTO test2 VALUES (?, ?)", 15, "Data")
	if err != nil {
		log.Fatal(err)
	}

	// 트랜잭션 커밋
	err = tx.Commit()
	if err != nil {
		log.Fatal(err)
	}
}