
事务(Transaction) 是数据库管理系统(DBMS)中的一个 逻辑操作单位,它由 一组操作组成,要么全部执行成功,要么全部不执行。
简单来说,事务保证数据库从一个一致性状态转换到另一个一致性状态,不会出现部分执行导致的数据错误。
常见例子:银行转账操作。

mysql> use RUNOOB;
Database changed
mysql> CREATE TABLE runoob_transaction_test( id int(5)) engine=innodb; # 创建数据表
Query OK, 0 rows affected (0.04 sec)
mysql> select * from runoob_transaction_test;
Empty set (0.01 sec)
mysql> begin; # 开始事务
Query OK, 0 rows affected (0.00 sec)
mysql> insert into runoob_transaction_test value(5);
Query OK, 1 rows affected (0.01 sec)
mysql> insert into runoob_transaction_test value(6);
Query OK, 1 rows affected (0.00 sec)
mysql> commit; # 提交事务
Query OK, 0 rows affected (0.01 sec)
mysql> select * from runoob_transaction_test;
+------+
| id |
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.01 sec)
mysql> begin; # 开始事务
Query OK, 0 rows affected (0.00 sec)
mysql> insert into runoob_transaction_test values(7);
Query OK, 1 rows affected (0.00 sec)
mysql> rollback; # 回滚
Query OK, 0 rows affected (0.00 sec)
mysql> select * from runoob_transaction_test; # 因为回滚所以数据没有插入
+------+
| id |
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.01 sec)
mysql>事务的可靠性由 ACID 四大特性保障:
示例:转账事务中,如果扣款成功但存款失败,事务会回滚,扣款也不生效。
示例:银行账户总余额在转账前后应保持不变,总金额保持一致。
示例:转账成功后,即使数据库宕机,账户余额修改也不会丢失。
隔离性是指 并发执行的事务之间互不干扰,每个事务的中间状态对其他事务不可见。隔离性可以有效避免并发操作导致的数据不一致问题。
在实际数据库中,隔离性不够会产生以下三类常见问题:
SQL 标准定义了四种隔离级别,分别解决不同程度的隔离问题:
隔离级别 | 允许出现的问题 | 特点说明 |
|---|---|---|
读未提交(Read Uncommitted) | 脏读、不可重复读、幻读 | 并发性能最高,但数据一致性最低 |
读已提交(Read Committed) | 不可重复读、幻读 | 每次读取都是已提交数据,防脏读 |
可重复读(Repeatable Read) | 幻读 | 防止同一事务中重复读取出现不同结果 |
串行化(Serializable) | 无 | 最严格的隔离级别,事务顺序执行,性能最差 |
数据库通过 锁机制 或 多版本控制(MVCC) 来实现隔离性:
持久性指 事务一旦提交,其对数据库的修改就是永久性的,不会因为系统崩溃或断电而丢失。
数据库通常通过以下方式保证持久性:
银行转账事务:
事务在实际系统中主要用于保证 数据一致性与完整性,常见应用场景包括:
事务(Transaction)是数据库中保证操作 原子性、一致性、隔离性、持久性(ACID) 的基本单元,通过四大特性保障数据在并发和故障情况下的可靠性:
事务广泛应用于金融支付、库存管理、订单处理及多表操作等场景,是保障数据库可靠性和数据一致性的核心机制。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。