事务(Transaction)是数据库管理系统中的一个逻辑工作单元,由一组操作(读/写)组成,这些操作要么全部成功,要么全部失败。事务具有四个关键特性,称为 ACID 特性:
MySQL 使用事务以确保数据的完整性和一致性。InnoDB 是 MySQL 默认的存储引擎,提供了对事务的支持。以下是 MySQL 实现事务的主要方式:
首先,我们创建一个示例数据库和两个表 accounts
和 transactions
,用于演示事务操作。
-- 连接到 MySQL 服务器
mysql -u root -p
-- 创建数据库
CREATE DATABASE bank;
-- 选择数据库
USE bank;
-- 创建 accounts 表
CREATE TABLE accounts (
account_id INT AUTO_INCREMENT PRIMARY KEY,
account_name VARCHAR(100) NOT NULL,
balance DECIMAL(10, 2) NOT NULL
);
-- 创建 transactions 表
CREATE TABLE transactions (
transaction_id INT AUTO_INCREMENT PRIMARY KEY,
from_account INT,
to_account INT,
amount DECIMAL(10, 2) NOT NULL,
transaction_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
向 accounts
表插入一些初始数据。
-- 插入初始数据到 accounts 表
INSERT INTO accounts (account_name, balance) VALUES ('Alice', 1000.00);
INSERT INTO accounts (account_name, balance) VALUES ('Bob', 1000.00);
以下是一个完整的事务操作示例,模拟从 Alice 的账户向 Bob 的账户转账。
-- 开始事务
START TRANSACTION;
-- 从 Alice 的账户减去 100 元
UPDATE accounts SET balance = balance - 100 WHERE account_name = 'Alice';
-- 向 Bob 的账户增加 100 元
UPDATE accounts SET balance = balance + 100 WHERE account_name = 'Bob';
-- 插入转账记录到 transactions 表
INSERT INTO transactions (from_account, to_account, amount)
SELECT a1.account_id, a2.account_id, 100
FROM accounts a1, accounts a2
WHERE a1.account_name = 'Alice' AND a2.account_name = 'Bob';
-- 检查转账是否成功
-- 如果所有操作都成功,则提交事务
COMMIT;
-- 如果有任何错误,则回滚事务
-- ROLLBACK;
可以使用以下命令设置事务的隔离级别:
-- 设置全局隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- 设置会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
以下是一个完整的示例,包括从开始事务、执行操作、提交或回滚事务以及设置隔离级别的过程:
-- 连接到 MySQL 服务器
mysql -u root -p
-- 创建数据库
CREATE DATABASE bank;
-- 选择数据库
USE bank;
-- 创建 accounts 表
CREATE TABLE accounts (
account_id INT AUTO_INCREMENT PRIMARY KEY,
account_name VARCHAR(100) NOT NULL,
balance DECIMAL(10, 2) NOT NULL
);
-- 创建 transactions 表
CREATE TABLE transactions (
transaction_id INT AUTO_INCREMENT PRIMARY KEY,
from_account INT,
to_account INT,
amount DECIMAL(10, 2) NOT NULL,
transaction_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 插入初始数据到 accounts 表
INSERT INTO accounts (account_name, balance) VALUES ('Alice', 1000.00);
INSERT INTO accounts (account_name, balance) VALUES ('Bob', 1000.00);
-- 设置会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- 开始事务
START TRANSACTION;
-- 从 Alice 的账户减去 100 元
UPDATE accounts SET balance = balance - 100 WHERE account_name = 'Alice';
-- 向 Bob 的账户增加 100 元
UPDATE accounts SET balance = balance + 100 WHERE account_name = 'Bob';
-- 插入转账记录到 transactions 表
INSERT INTO transactions (from_account, to_account, amount)
SELECT a1.account_id, a2.account_id, 100
FROM accounts a1, accounts a2
WHERE a1.account_name = 'Alice' AND a2.account_name = 'Bob';
-- 检查转账是否成功
-- 如果所有操作都成功,则提交事务
COMMIT;
-- 如果有任何错误,则回滚事务
-- ROLLBACK;
事务是数据库管理系统中的一个重要概念,确保数据的一致性和完整性。MySQL 提供了丰富的事务支持,通过 START TRANSACTION
、COMMIT
和 ROLLBACK
等命令可以实现事务的管理。在实际使用中,合理设置事务的隔离级别,避免死锁,合理使用锁机制,可以有效提高数据库的性能和可靠性。