MySql的初学习 -- 第六章 -- 了解事务
博客说明
文章内容输出来源:拉勾教育Java就业急训营
什么是事务
事务是一个整体,由一条或者多条SQL 语句组成,这些SQL语句要么都执行成功,要么都执行失败, 只要有 一条SQL出现异常,整个操作就会回滚,整个业务执行失败
重点:MySql默认打开自动事务!!
关于事务的例子
比如: 银行的转账业务,张三给李四转账500元, 至少要操作两次数据库, 张三 - 500, 李四 + 500,
这中间任何一步出现问题,整个操作就必须全部回滚, 这样才能保证用户和银行都没有损失.
回滚
即在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成 的操作全部撤销,滚回到事务开始时的状态。(在提交之前执行)
MySql事务操作
手动提交事务
功能 | 语句 |
---|---|
开启事务 | start transaction; 或者 BEGIN; |
提交事务 | commit; |
回滚事务 | rollback; |
查看事务状态
在命令行中登录MySql后,查看autocommit状态
SHOW VARIABLES LIKE 'autocommit';
状态 | 内容 |
---|---|
ON | 自动提交(开启) |
OFF | 手动提交(关闭) |
MySql事务的四大特性
特性 | 含义 |
---|---|
原子性 | 每一个事务都是一个整体,不可拆分事务中所有的SQL要么都执行成功,要么都失败 |
一致性 | 事务在执行前数据库的状态 与 执行后数据库状态保持一致,比如转账前两人总金额是2000,转账后总金额也是2000 |
隔离性 | 事务与事务之间不应该相互影响,执行时要保持隔离状态 |
持久性 | 一旦事务执行成功,对数据库的修改的持久的(永久),就算关机数据也是要保存下来 |
MySql事务隔离级别
了解隔离级别之前,要了解为什么需要隔离级别
为什么需要隔离级别(数据并发访问)
数据并发访问: 一个数据库可能拥有多个访问客户端,这些客户端都可以并发方式访问数据库. 数据库的相同数据可能
被多个事务同时访问,如果不采取隔离措施,就会导致各种问题, 破坏数据的完整性
并发访问会产生的问题
事务在操作时的理想状态: 所有的事务之间保持隔离,互不影响。
因为并发操作,多个用户同时访问 同一个 数据。可能引发并发访问的问题
并发访问的问题 | 说明 |
---|---|
脏读 | 一个事务读取到了另一个事务中尚未提交的数据 |
不可重复读 | 一个事务中,两次读取的数据不一致 |
幻读 | 一个事务中,一次查询的结果无法支撑后续的业务操作 |
MySql事务隔离级别
安全级别:1
read uncommitted:读未提交
可以防止的问题:不能解决任何并发访问会产生的问题
安全级别:2
read committed:读已提交(Oracle默认的隔离级别)
可以防止的问题:脏读
安全级别:3
repeatable read:可重复读(MySql默认的隔离级别)
可以防止的问题:脏读、不可重复读
安全级别:4
serializable:串行化
可以防止的问题:脏读、不可重复读、幻读
注意:隔离级别从小到大,安全性越来越高,但是效率越来越低,需根据不同的情况选择对应的级别
隔离级别的相关命令
- 查看隔离级别:
select @@tx_isolation;
- 设置隔离级别:
-- 格式:set global transaction isolation level 级别名称;
-- 级别名称:
-- read uncommitted 读未提交
-- read committed 读已提交
-- repeatable read 可重复读
-- serializable 串行化
set global transaction isolation level repeatable read;
Sqlyog:
修改完隔离级别后,需要重新启动一个新链接或重新启动Sqlyog
MySql命令行(管理员身份运行):
修改完隔离级别后,需要重新打开命令行