如何通过MySQL事务实现复杂业务逻辑的自动处理?
摘要:2. 如何使用事务 使用事务有两种方式,分别为 显式事务 和 隐式事务 。 2.1 显式事务 步骤1
2. 如何使用事务
使用事务有两种方式,分别为 显式事务 和 隐式事务 。
2.1 显式事务
步骤1: START TRANSACTION或者BEGIN,作用是显式开启一个事务。
mysql> BEGIN;
#或者
mysql> START TRANSACTION;
START TRANSACTION 语句,相较于 BEGIN 特别之处在于,后边能跟随几个 修饰符 :
① READ ONLY :标识当前事务是一个 只读事务 ,也就是属于该事务的数据库操作只能读取数据,而不能修改数据。
补充:只读事务中只是不允许修改,那些其他事务也能访问到的表中的数据。对于临时表来说(我们使用 CREATE TMEPORARY TABLE 创建的表),由于它们只能再当前会话中可见,所有只读事务其实也是可以对临时表进行增、删、改操作的。
② READ WRITE(默认) :标识当前事务是一个 读写事务 ,也就是属于该事务的数据库操作,既可以读取数据, 也可以修改数据。
③ WITH CONSISTENT SNAPSHOT :启动一致性读。
===== 🌟 青柠来相伴,代码更简单。🌟 =====
📚 本文所有内容,我都整理成了文档资料。👇
🎯 搜索【青柠代码录】,即可查看所有博客文章。
===== 🌟 ================= 🌟 =====
比如:
START TRANSACTION READ ONLY; # 开启一个只读事务
START TRANSACTION READ ONLY, WITH CONSISTENT SNAPSHOT # 开启只读事务和一致性读
START TRANSACTION READ WRITE, WITH CONSISTENT SNAPSHOT # 开启读写事务和一致性读
注意:
READ ONLY和READ WRITE是用来设置所谓的事务访问模式的,就是以只读还是读写的方式来访问数据库中的数据,一个事务的访问模式不能同时即设置为只读的也设置为读写的,所以不能同时把READ ONLY和READ WRITE放到START TRANSACTION语句后边。
如果我们不显式指定事务的访问模式,那么该事务的访问模式就是读写模式
步骤2:一系列事务中的操作(主要是DML,不含DDL)
步骤3:提交事务 或 中止事务(即回滚事务)
# 提交事务。当提交事务后,对数据库的修改是永久性的。
mysql> COMMIT;
# 回滚事务。即撤销正在进行的所有没有提交的修改
mysql> ROLLBACK;
# 将事务回滚到某个保存点。
mysql> ROLLBACK TO [SAVEPOINT]
其中关于SAVEPOINT相关操作有:
# 在事务中创建保存点,方便后续针对保存点进行回滚。一个事务中可以存在多个保存点。
SAVEPOINT 保存点名称;
# 删除某个保存点
RELEASE SAVEPOINT 保存点名称;
2.2 隐式事务
MySQL中有一个系统变量 autocommit :
mysql> SHOW VARIABLES LIKE 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.01 sec)
默认情况下,如果我们不显式的使用 START TRANSACTION 或者 BEGIN 语开启一个事务,那么每一条语句都算是一个独立的事务,这种特性称之为事务的 自动提交。
也就是说,不以START TRANSACTION 或者 BEGIN 语句显式的开启一个事务,那么下边这两条语句,就相当于放到两个独立的事务中去执行:
UPDATE account SET balance = balance - 10 WHERE id = 1;
UPDATE account SET balance = balance + 10 WHERE id = 2;
当然,如果我们想关闭这种 自动提交 的功能,可以使用下边两种方法之一:
显式的的使用 START TRANSACTION 或者 BEGIN 语句开启一个事务。这样在本次事务提交、或者回滚前,会暂时关闭掉自动提交的功能。
