Go에서는 트랜잭션 작업에 Tx 유형을 사용할 수 있습니다. 트랜잭션을 시작하려면 db.Begin()을 사용하세요. 트랜잭션 블록에서는 쿼리, 업데이트 등의 데이터베이스 작업이 수행됩니다. 성공적으로 실행된 후 tx.Commit()을 사용하여 트랜잭션을 커밋합니다. 실제로 트랜잭션은 재고 업데이트 및 동시에 주문 생성과 같은 동시 작업의 일관성을 보장합니다.
Go에서 트랜잭션은 모두 성공하거나 모두 실패하는 원자적 작업의 모음입니다. 이는 특히 여러 동시 작업으로 인해 데이터가 손상될 수 있는 상황에서 데이터베이스 작업의 무결성을 보장하는 데 사용됩니다.
Go의 트랜잭션은 database/sql
의 Tx
유형으로 표시됩니다. 트랜잭션을 시작하려면 다음을 수행하세요. database/sql
中的 Tx
类型表示。要开始一个事务,请执行以下操作:
tx, err := db.Begin() if err != nil { return fmt.Errorf("failed to begin transaction: %w", err) }
在事务块中,您可以执行任何数据库操作。例如,以下代码从表中选择一条记录并将其更新为新值:
var id, version int if err := tx.QueryRow("SELECT id, version FROM example WHERE name = ?", "foo").Scan(&id, &version); err != nil { return fmt.Errorf("failed to select: %w", err) } result, err := tx.Exec("UPDATE example SET version = ? WHERE id = ? AND version = ?", version+1, id, version) if err != nil { return fmt.Errorf("failed to update: %w", err) }
在所有操作成功执行后,您可以使用 tx.Commit()
提交事务:
if err := tx.Commit(); err != nil { // 放弃事务 if err := tx.Rollback(); err != nil { return fmt.Errorf("failed to rollback transaction: %w", err) } return fmt.Errorf("failed to commit transaction: %w", err) }
考虑一个网上商店的数据库,该数据库包括一个 products
表和一个 orders
func CreateOrder(db *sql.DB, productID int, quantity int) error { tx, err := db.Begin() if err != nil { return fmt.Errorf("failed to begin transaction: %w", err) } var stock int if err := tx.QueryRow("SELECT stock FROM products WHERE id = ?", productID).Scan(&stock); err != nil { return fmt.Errorf("failed to select: %w", err) } if stock < quantity { return tx.Rollback() // 放弃事务,因为没有足够的库存 } if _, err := tx.Exec("UPDATE products SET stock = ? WHERE id = ?", stock-quantity, productID); err != nil { return fmt.Errorf("failed to update: %w", err) } if _, err := tx.Exec("INSERT INTO orders (product_id, quantity) VALUES (?, ?)", productID, quantity); err != nil { return fmt.Errorf("failed to insert: %w", err) } if err := tx.Commit(); err != nil { return fmt.Errorf("failed to commit transaction: %w", err) } return nil }
tx.Commit()
를 사용하여 트랜잭션을 커밋할 수 있습니다. : products
테이블과 orders
테이블이 포함된 온라인 상점 데이터베이스를 생각해 보세요. 우리는 다음을 수행하기 위해 거래를 생성하려고 합니다. 제품에 재고가 충분한지 확인하세요.
🎜재고가 있는 경우 해당 상품의 재고를 차감하여 주문이 이루어집니다. 🎜🎜rrreee🎜트랜잭션을 사용하여 동일한 제품에서 재고를 차감하려는 여러 동시 주문이 있더라도 매장의 재고가 항상 정확하도록 보장합니다. 🎜위 내용은 Golang에서 트랜잭션을 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!