MySQL学习之事务控制
MySQL学习之事务控制
事务是指作为一个逻辑工作单元执行的一系列操作,这些操作要么全部成功,要么全部失败。事务确保了多个数据的修改作为一个单元来处理。在MySQL中,只有使用了Innodb存储引擎的数据库或表才支持事务。
事务用于维护数据库的完整性,保证成批的SQL语句要么都执行,要么都不执行。例如,张三在ATM机上给李四转账100元,在银行的业务系统中,主要会执行两步数据变更操作:从张三的账户减去100元,给李四的账户增加100元。如果操作1执行成功,操作2执行失败会发生什么?
如果操作1执行成功,操作2执行失败,那么张三的账户会扣除100元,但是李四的账户不会增加100元。这显然是不合理的,因此需要使用事务来确保这两个操作要么同时成功,要么同时失败。
事务的四个特性
如果某个数据库支持事务,那么该数据库必须具备ACID四个特性,即:
1. 原子性:事务必须是原子工作单元,事务中包含的各操作要么都做,要么都不做。
2. 一致性:事务在执行完成时,必须使所有的数据都保持一致状态。
3. 隔离性:事务独立运行。多个事务之间相互隔离,互不干扰。事务的100%隔离,会牺牲速度。
4. 持久性:事务执行完成之后,它对系统的影响是永久性的。
MySQL的事务控制
在默认情况下,MySQL是自动提交事务的,即每一条INSERT、UPDATE、DELETE的SQL语句提交后会立即执行COMMIT操作。因此,要开启一个事务,可以使用start transaction或begin,或者将autocommit的值设置为0。
下面通过一个例子来演示如何使用MySQL的事务控制:
1. 创建bank_account数据表并插入两条记录,设置张三的balance字段值加1000。
```
CREATE TABLE bank_account (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) COMMENT '姓名',
balance DECIMAL(18,2) COMMENT '账户余额'
);
INSERT INTO bank_account(id,name,balance) VALUES(1,'张三',0);
INSERT INTO bank_account(id,name,balance) VALUES(2,'李四',0);
UPDATE bank_account SET balance=balance+1000 WHERE id=1;
```
2. 开启事务控制并执行两条SQL语句,一条将张三的账户减去100元,另一条将李四的账户增加100元。然后提交事务。
```
START TRANSACTION;
UPDATE bank_account SET balance=balance-100 WHERE id=1;
UPDATE bank_account SET balance=balance+100 WHERE id=2;
COMMIT;
```
3. 再次开始事务控制,同样插入两条一样的SQL语句,但将commit(提交)变为rollback(回滚),然后回滚事务。
```
START TRANSACTION;
UPDATE bank_account SET balance=balance-100 WHERE id=1;
UPDATE bank_account SET balance=balance+100 WHERE id=2;
ROLLBACK;
```
4. 查看此时数据表的内容,发现回滚之后数据无变化。
```
SELECT * FROM bank_account;
```
本文介绍了MySQL的事务控制,包括事务的基本概念和四个特性,以及如何使用MySQL的事务控制。希望能帮助大家更好地理解MySQL的事务控制。

-
MySQL Workbench怎么建立数据库(附:sql语句创建数据库方法) 2023-07-20 12:22:29
-
MySQL Workbench是什么?(附:如何设置中文教程) 2023-07-20 11:42:31
-
一起聊聊MySQL主从延时的处理方案 2023-05-14 07:00:03
-
mysql怎么将查询结果赋给变量 2023-05-14 07:00:03
-
mysql驱动是什么 2023-05-14 07:00:03
-
qt5.8如何连接mysql 2023-05-14 07:00:03
-
MySQL 语法整理介绍 2023-05-14 07:00:03
-
mysql修改表结构的语句是什么 2023-05-14 07:00:03
-
mysql乐观锁和悲观锁的区别是什么 2023-05-14 07:00:03
-
mysql查询怎么区分大小写 2023-05-14 07:00:02