MySQL(11)什么是事务?MySQL如何实现事务?

什么是事务?

事务(Transaction)是数据库管理系统中的一个逻辑工作单元,由一组操作(读/写)组成,这些操作要么全部成功,要么全部失败。事务具有四个关键特性,称为 ACID 特性:

  1. 原子性(Atomicity):事务中的所有操作是一个整体,要么全部成功,要么全部回滚。
  2. 一致性(Consistency):事务执行前后,数据库的状态必须保持一致。
  3. 隔离性(Isolation):并发事务之间互不影响,事务的中间状态对其他事务不可见。
  4. 持久性(Durability):一旦事务提交,所做的修改将持久保存,即使系统崩溃也不会丢失。

MySQL如何实现事务?

MySQL 使用事务以确保数据的完整性和一致性。InnoDB 是 MySQL 默认的存储引擎,提供了对事务的支持。以下是 MySQL 实现事务的主要方式:

  1. START TRANSACTION:开始一个事务。
  2. COMMIT:提交事务,将所有的修改持久保存到数据库。
  3. ROLLBACK:回滚事务,撤销事务中的所有操作。

事务的使用示例代码

创建示例表

首先,我们创建一个示例数据库和两个表 accountstransactions,用于演示事务操作。

-- 连接到 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;

事务使用的注意事项

  1. 锁机制:在事务处理中,锁机制用于确保数据的一致性和隔离性。MySQL 支持行级锁和表级锁,InnoDB 默认使用行级锁。
  2. 死锁处理:当两个或多个事务相互等待对方释放锁时,会发生死锁。MySQL 有死锁检测机制,可以检测到死锁并回滚其中一个事务以解除死锁。
  3. 隔离级别:不同的隔离级别决定了事务间的可见性和一致性。MySQL 支持四种隔离级别:
    • READ UNCOMMITTED:最低级别,允许读取未提交的数据。
    • READ COMMITTED:允许读取已提交的数据。
    • REPEATABLE READ:默认级别,确保在同一个事务中多次读取的数据是一致的。
    • SERIALIZABLE:最高级别,完全隔离,确保事务顺序执行。
设置隔离级别

可以使用以下命令设置事务的隔离级别:

-- 设置全局隔离级别
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 TRANSACTIONCOMMITROLLBACK 等命令可以实现事务的管理。在实际使用中,合理设置事务的隔离级别,避免死锁,合理使用锁机制,可以有效提高数据库的性能和可靠性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辞暮尔尔-烟火年年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值