MySQL-事务
什么是事务?
事务:
transaction
一个数据库事务由一条或者多条sql语句构成,它们形成一个逻辑的工作单元。这些sql语句要么全部执行成功,要么全部执行失败。
- 事务是保证数据的完整性和一致性的重要手段。
- DML事务: 由一条或者多条DML语句构成
- DDL事务: 总是由一条DDL语句构成
- DCL事务: 总是由一条DCL语句构成
简单来说:办理一件事,背后会有多个操作,这些步骤合起来成为事
务。但步骤有一条错了,那整个事情就是失败,全部成功,那才算成功。
事务的开始和结束
一条sql语句就会开始一个事务
查看事务是否开启?
注意
也就是说 DDL DXL语句,MySQL会自动执行,跟变量autocommit是关闭
还是开启没有关系,都会自动提交。
清晰的事务控制语句流程图
-
开始事务:事务开始时,可以执行多个数据库操作,如插入、更新或删除数据。
-
执行 DELETE 操作:在这个特定的事务中,首先执行了一个删除操作。
-
设置保存点 A:在删除操作之后,设置了一个保存点A。这样做可以在事务执行过程中,如果需要,可以只回滚到这个点,而不是事务的开始。
-
执行 INSERT 操作:在设置保存点A之后,进行了数据插入操作。
-
执行 UPDATE 操作:接下来执行了更新操作。
-
设置保存点 B:在更新操作之后,设置了第二个保存点B。
-
执行另一个 INSERT 操作:在保存点B之后,执行了另一个插入操作。
-
回滚到保存点 B:由于某些原因,需要撤销最后的插入操作,于是事务被回滚到保存点B,这意味着最后的插入操作被撤销,但保存点B之前的操作(包括第一个插入和更新操作)仍然有效。
-
回滚到保存点 A:接下来,事务又被回滚到保存点A,这意味着回滚到保存点A之后所有的操作都被撤销,只留下第一次的删除操作。
-
完全回滚事务:最后,整个事务被完全回滚,这意味着所有的操作,包括删除操作,都被撤销,数据库回到了事务开始之前的状态。
演示一下事务过程
root@gh 11:01 mysql>CREATE TABLE players( id INT, NAME VARCHAR(20) );
Query OK, 0 rows affected (0.00 sec)
root@gh 11:02 mysql>START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
root@gh 11:02 mysql>INSERT INTO players(id,NAME) VALUES(1,'gh');
Query OK, 1 row affected (0.00 sec)
root@gh 11:03 mysql>INSERT INTO players(id,NAME) VALUES(2,'gf');
Query OK, 1 row affected (0.00 sec)
root@gh 11:03 mysql>SAVEPOINT a;
Query OK, 0 rows affected (0.00 sec)
root@gh 11:04 mysql>update players set NAME='ww' where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
root@gh 11:05 mysql>SAVEPOINT b;
Query OK, 0 rows affected (0.00 sec)
root@gh 11:05 mysql>delete from players where id=2;
Query OK, 1 row affected (0.00 sec)
root@gh 11:05 mysql>select * from players;
+------+------+
| id | NAME |
+------+------+
| 1 | ww |
+------+------+
1 row in set (0.00 sec)
root@gh 11:05 mysql>ROLLBACK TO b;
Query OK, 0 rows affected (0.00 sec)
root@gh 11:06 mysql>select * from players;
+------+------+
| id | NAME |
+------+------+
| 1 | ww |
| 2 | gf |
+------+------+
2 rows in set (0.00 sec)
root@gh 11:06 mysql>ROLLBACK TO a;
Query OK, 0 rows affected (0.00 sec)
root@gh 11:06 mysql>select * from players;
+------+------+
| id | NAME |
+------+------+
| 1 | gh |
| 2 | gf |
+------+------+
2 rows in set (0.00 sec)
root@gh 11:06 mysql>ROLLBACK;
Query OK, 0 rows affected (0.00 sec)
root@gh 11:06 mysql>select * from players;
Empty set (0.00 sec)
root@gh 11:06 mysql>
COMMIT 或 ROLLBACK 语句之前的数据的状态
并发事务的4个问题
- 脏读
- 不可重复读
- 幻读
- 丢失更新
详细解释
事务有4个特性
-
原子性(Atomicity):像一个原子一样不可分割。事务中的操作要么全部完成,要么全部不做,就像是你去超市买东西,要么一次买齐所有的东西,要么一样都不买,不能只买一半。
-
一致性(Consistency):确保数据库从一个正确的状态转移到另一个正确的状态。比如你在银行转账,无论转账成功还是失败,两个账户的总金额应该保持不变。
-
隔离性(Isolation):事务之间不会互相影响,就像是给每个事务一个独立的房间操作,它们之间互不干扰。
-
持久性(Durability):一旦事务完成,无论发生什么(比如停电或系统崩溃),结果都会被永久记录下来,就好比你发了一封信,信已经寄出,无论如何都无法撤回。
这四个特性确保了数据库事务的可靠性和稳定性,让数据管理更加安全和高效。
事务的四个隔离级别
- 读未提交: 就像是在图书馆里,任何人都可以随时阅读任何书籍,即使别人还没读完放回书架。这意味着你可能看到别人还没完成的笔记或标记。
- 读已提交: 这就像是你只能看到别人已经读完并放回书架的书。在这个级别上,一旦别人的研究或笔记完成并“提交”了,你才能看到他们的成果。
- 可重复读: 如果你开始读一本书,直到你读完,别人不能在书上做标记或改动。这样你就可以多次读书而内容不会改变,直到你放回书架。
- 可串行化: 这是最严格的隔离级别。就像给每个人一个单独的小房间来读书,完全避免了干扰。只有当一个人读完一本书并离开小房间之后,另一个人才能进去,保证了完全的隐私和一致性。
随着隔离级别的提高,数据的准确性和一致性也随之提高,但可能会牺牲一些系统的效率。就像在图书馆里,如果每个人都有一个小房间,那么同时能服务的读者数量就会减少。
在MySQL中查看隔离级别
在MySQL中(可重复读)REPEATABLE-READ 是默认的隔离级别!