MySQL:事务

在数据库管理中,事务(Transaction)是一组操作的集合,这些操作要么全部成功,要么全部失败。事务确保了数据的完整性和一致性,即使在并发操作或系统故障的情况下也能做到这一点。

一、事务的四个特性(ACID)

事务通常遵循 **ACID** 原则,确保事务的可靠性:

1. 原子性(Atomicity)

        事务中的所有操作被视为一个单一的操作单位,要么全部成功,要么全部失败。如果其中任何一个操作失败,整个事务将回滚,之前的所有操作都将恢复到事务开始之前的状态。

2. 一致性(Consistency)

        事务必须使数据库从一种一致状态转换到另一种一致状态。事务开始前和结束后的数据都必须符合所有定义的约束、规则和关系。

3. 隔离性(Isolation)

        事务的执行不应受到其他事务的影响。并发执行的事务应该是独立的,因此即使多个事务同时执行,每个事务的结果应该是可预测的。数据库通常使用隔离级别来管理事务的并发执行。

4. 持久性(Durability)

        一旦事务提交,其结果是永久的,即使系统崩溃或发生故障,数据库的状态也应该保持在事务提交时的状态。持久性保证了已经提交的事务对数据库的修改是永久存储的。

二、事务的控制

在 SQL 中,可以使用以下语句来控制事务:

1. BEGIN TRANSACTION / START TRANSACTION

开始一个新事务。
        START TRANSACTION;

2. COMMIT

提交事务,保存所有在事务中的更改。
        COMMIT;

3. ROLLBACK

        回滚事务,撤销在事务中所做的所有更改。

        ROLLBACK;

三、示例

下面是一个使用 MySQL 的事务的简单示例,演示如何处理银行转账操作。模拟从一个账户转账到另一个账户:

create table accounts
(
    id      INT primary key,
    balance DECIMAL(10, 2)
);

-- 假设账户 A 和账户 B
insert into
    accounts (id, balance)
values
    (1, 1000.00),
    (2, 500.00);

-- 启动事务
start transaction;

-- 从账户 A 中扣款
update accounts
set
    balance = balance - 200.00
where
    id = 1;

-- 向账户 B 存款
update accounts
set
    balance = balance + 200.00
where
    id = 2;

-- 提交事务
commit;

如果在转账过程中的任一步骤发生错误(例如,账户 A 的余额不足),可以使用 `ROLLBACK` 来撤销已经执行的操作:

四、事务的隔离级别

不同的事务隔离级别会影响并发操作的行为:

1. 读未提交(READ UNCOMMITTED)

        允许事务读取其他事务未提交的数据,可能导致脏读(Dirty Reads)。

2. 读已提交(READ COMMITTED)

        事务只能读取已提交的数据,防止脏读,但可能会发生不可重复读(Non-repeatable Reads)。

3. 可重复读(REPEATABLE READ)

        事务在执行期间能够多次读取同一数据行,每次返回相同结果,防止脏读和不可重复读,但可能导致幻读(Phantom Reads)。

4. 序列化(SERIALIZABLE)

        强制事务顺序执行,完全避免并发问题,但性能最低。

五、总结

事务是确保数据库一致性的关键机制,通过支持事务的 ACID 特性和适当的控制语句,可以有效处理数据的批量更新、并发操作及错误回滚等情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

00&00

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

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

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

打赏作者

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

抵扣说明:

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

余额充值