后端开发中转账、订单等场景的数据异常根源多在MySQL事务。它是保障数据一致的关键也是开发者必备的核心技能。1.事务的概念事务是把一组SQL语句给封装成一条事务要么全部成功要么全部失败。2. ACID特性a.原子性(A)一个事务的所有操作要不全部成功要么全部失败当然失败会回滚这是支持事务的最基本的特性。b.一致性©事务执行结束之后保证数据正确且符合预期。c.隔离性(I)每个事务之间相互独立互不影响。d.持久性(D)事务一旦成功就需要存储在存储介质中即使系统崩溃或断电数据也不会丢失。3. 使用事务(1).查看是否支持事务show engines; – 用于查看数据库存储引擎在MySQL中是InnoDB存储引擎Transactions是事务。yes即支持(2).事务使用语法start transaction; – 开启事务 在提交或者回滚之前的SQL语句都是事务中的sqlbegin; – 开启事务和上面那条语句是一样的效果commit; – 提交事务rollback; – 回滚事务4. 保存点在事务中也可以设置保存点可以直接回滚到指定保存点。语法savepoint 保存点名; – 创建保存点rollback to 保存点名; – 回滚到指定保存点5. 自动/手动提交事务查看是否开启自动提交事务show variables like ‘autocommit’;一条 DML 语句 一条 insert 或 一条 update 或 一条 deleteValue含义ON默认状态自动提交开启每执行一条 DML 语句INSERT/UPDATE/DELETEMySQL 会立即自动COMMIT语句效果永久生效无法用ROLLBACK撤销。OFF自动提交关闭执行 DML 语句后不会自动提交必须手动执行COMMIT才会生效ROLLBACK可撤销未提交的操作。注只要打开事务只有commit才能持久化6. 事务的隔离级别隔离级别英文全称解决的问题存在的问题并发性能读未提交READ UNCOMMITTED无最低级别脏读、不可重复读、幻读最高读已提交Oracle 默认READ COMMITTED脏读不可重复读、幻读较高可重复读MySQL 默认REPEATABLE READ脏读、不可重复读幻读InnoDB 已解决中等串行化SERIALIZABLE所有问题完全隔离并发性能极差单线程执行a.脏读一个事务读取到另外一个事务未提交的修改数据。比如 A 转账给 B未提交B 却看到余额增加。b.不可重复读一个事务多次读取同一条数据得到了不同的数据。比如 A 事务读了余额B 事务修改并提交A 再读余额变了c.幻读 同一事务内多次执行同一查询结果集行数不一致比如 A 查余额 1000 的账户有 2 个B 新增 1 个并提交A 再查变成 3 个。7. 查看和设置事务的隔离级别SELECT transaction_isolation; – 查看事务的隔离级别SET [SESSION/GLOBAL] TRANSACTION ISOLATION LEVEL 隔离级别; – 设置隔离级别GLOBAL设置全局事务的隔离级别。SESSION只针对当前连接的会话事务的隔离级别会话断开之后对其不影响。