5

MySQL事务 - lyxlucky

 7 months ago
source link: https://www.cnblogs.com/lyxlucky/p/17997975
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

MySQL事务是一个执行单元,在mysql中,对数据的一次操作或多次操作可以组合成一个事务,这些操作要么同时成功执行,要么同时失败。

一、事务的性质

事务有四个基本特性,通常被称为ACID属性。

  1. 原子性(Atomicity): 如果事务中的所有操作都成功,则事务被提交。如果事务中的任何操作失败,则事务被回滚到启动事务之前的状态。

  2. 一致性(Consistency): 数据库应始终从一个一致的状态转换到另一个一致的状态。

  3. 隔离性(Isolation): 并发执行的事务的修改必须被隔离。事务看到的数据必须与其他并发事务无关。

  4. 持久性(Durability): 一旦事务被提交,其结果就是永久性的,即使发生故障也能恢复。

二、事务的基本操作

在MySQL中,事务包括以下基本操作:

  • START TRANSACTION 开始一个新的事务
  • COMMIT 提交当前事务
  • ROLLBACK 回滚当前事务
  • SAVEPOINT 在当前事务内创建一个保存点,以便将事务回滚到该点而非整个事务
  • ROLLBACK TO SAVEPOINT 回滚到指定的SAVEPOINT
  • RELEASE SAVEPOINT 删除一个SAVEPOINT

三、事务用例详解

例1:使用 START TRANSACTION、COMMIT 和 ROLLBACK

首先,我们创建一个表 orders

CREATE TABLE orders (
    id INT PRIMARY KEY,
    product VARCHAR(50),
    quantity INT,
    price DECIMAL(5, 2)
);

然后,我们插入一些数据:

INSERT INTO orders VALUES 
    (1, 'Apple', 10, 0.50),
    (2, 'Banana', 20, 0.25),
    (3, 'Orange', 15, 0.30);

假设我们执行以下事务:

START TRANSACTION;
UPDATE orders SET quantity = quantity - 1 WHERE product = 'Apple';
UPDATE orders SET quantity = quantity + 1 WHERE product = 'Orange';
COMMIT;

这个事务的目的是将'Apple'的数量减1,并将'Orange'的数量增1。当执行COMMIT操作时, 更改对所有其他用户都可见。如果这两个更新操作之一失败,如由于某些原因导致'Orange'无法增加数量,可以用ROLLBACK将事务回滚到最初的状态。

例2:使用 SAVEPOINT 和 ROLLBACK TO SAVEPOINT

让我们创建一个保存点并回滚到该点:

START TRANSACTION;
UPDATE orders SET quantity = quantity - 5 WHERE product = 'Banana';
SAVEPOINT reduce_apple;
UPDATE orders SET quantity = quantity - 5 WHERE product = 'Apple';
-- 假设此时'Apple'的库存不能更低,我们需要回滚到SAVEPOINT
ROLLBACK TO SAVEPOINT reduce_apple;
UPDATE orders SET quantity = quantity + 5 WHERE product = 'Orange';
COMMIT;

在这个事务中,如果在减少'Apple'的数量时出现问题,我们可以将事务回滚到SAVEPOINT,然后尝试对'Orange'进行类似的操作。

四、结束语

适当理解和使用事务可以在保证数据完整性的同时,有效提高多用户场景下的数据并发处理能力。希望上述示例能帮助您更好地理解和使用MySQL事务。

如果你有任何问题或者需要更深入的信息,非常欢迎你提问!

__EOF__


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK