目录
事务的应用场景说明
什么是事务: 在实际的开发过程中,一个业务操作如:转账,往往是要多次访问数据库才能完成的。转账是一个用户扣钱,另一个用户加钱。如果其中有一条 SQL 语句出现异常,这条 SQL 就可能执行失败。
事务执行是一个整体,所有的 SQL 语句都必须执行成功。如果其中有 1 条 SQL 语句出现异常,则所有的SQL 语句都要回滚,整个业务执行失败。
-
手动提交事务
MYSQL 中可以有两种方式进行事务的操作:
1) 手动提交事务
2) 自动提交事务 默认是自动提交事务
手动提交事务的 SQL 语句
功能 | Sql语句 |
开启事务 | start transaction; |
提交事务 | commit; |
回滚事务 | rollback; |
事务的四大特性 ACID
事务特性 | 含义 |
原子性(Atomicity) | 每个事务都是一个整体,不可再拆分,事务中所有的 SQL 语句要么都执行成功, 要么都失败。 |
一致性(Consistency) | 事务在执行前数据库的状态与执行后数据库的状态保持一致。如:转账前2个人的 总金额是2000 ,转账后2个人总金额也是2000。 |
隔离性(Isolation ) | 事务与事务之间不应该相互影响,执行时保持隔离的状态。 |
持久性(Durability ) | 一旦事务执行成功,对数据库的修改是持久的。就算关机,也是保存下来的。 |
事务的隔离级别
事务在操作时的理想状态: 所有的事务之间保持隔离,互不影响。因为并发操作,多个用户同时访问同一个数据。可能引发并发访问的问题:
并发访问的问题 | 含义 |
脏读 | 一个事务读取到了另一个事务中尚未提交的数据 |
不可重复读 | 一个事务中两次读取的数据 内容 不一致,要求的是一个事务中多次读取时数据是一致的, 这是事务 update 时引发的问题 |
幻读 | 一个事务中两次读取的数据的 数量 不一致,要求在一个事务多次读取的数据的数量是一致的,这是 insert 或 delete 时引发的问题 |
MySQL 数据库有四种隔离级别
上面的级别最低,下面的级别最高。“是”表示会出现这种问题,“否”表示不会出现这种问题。
级别 | 名字 | 隔离级别 | 脏读 | 不可重复读 | 幻读 |
1 | 读未提交 | read uncommitted | 是 | 是 | 是 |
2 | 读已提交 | read committed | 否 | 是 | 是 |
3 | 可重复读 | repeatable read | 否 | 否 | 是 |
4 | 串行化 | serializable | 否 | 否 | 否 |
隔离级别越高,性能越差,安全性越高。
MySQL的默认隔离级别为 第3级别 repeatable read
# 查看数据库隔离级别 show variables like '%transaction_isolation%'; |
- 设置当前会话(连接) 或 全局 的事务隔离级别:
SET SESSION | GLOBAL TRANSACTION ISOLATION LEVEL 级别字符串; |