如何通过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 语句开启一个事务。这样在本次事务提交、或者回滚前,会暂时关闭掉自动提交的功能。
阅读全文