事务
事务特性:
1.失败后,可以回到开始的状态
2.事务内的操作没有全部成功之前,别的用户(进程、会话)不能看到操作内的数据修改。
实现思路:
在一组操作之前设置一个备份点(记号)。如果事务成功,则让别的用户看到更改;如果事务失败,则回滚到备份点的位置。
实现方法:
使用innodb引擎的事务日志功能。
Sql的执行分成两个阶段:
1.执行阶段
2.将执行结果提交到数据库
其中,事务日志保存的就是执行阶段的结果,如果用户选择提交,则将结果同步到数据库。默认的执行方式是自动提交,即执行完毕后自动同步到数据库。存在一个系统变量auto_commit,可以对自动提交进行配置,使用show variables like ‘autocommit’; (因为系统变量非常多,所以通常使用show variables like ...语法查看某一特定的变量)可以查看系统变量。使用set auto_commit=1; 打开自动提交功能。Set auto_commit=0; 关闭自动提交功能(通常用于测试)。自动提交关闭的状态下,可以使用commit命令手动提交,如果出现错误,使用rollback命令回滚一次。
常见的事务指令:
1.开启事务: start transaction;
2.成功: commit; 提交
3.失败: rollback; 回滚
事务的特点:
ACID属性:
原子性(atomicity)、
一致性(consistency)、
隔离性(isolation)、
持久性(durability)
事务的隔离级别:
数据库的事务隔离级别有四个,由低到高分别是: read uncommitted, read committed, repeatable read, serializable。这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。
| 脏读 | 不可重复读 | 幻读 |
Read uncommiteed | √ | √ | √ |
Read committed | 叉 | √ | √ |
Repeatable read | 叉 | 叉 | √ |
serializable | 叉 | 叉 | 叉 |
注:“√”表示可能出现,“叉”表示不会出现
大多数数据库的默认隔离级别是read committed,如oracle,sqlserver。Mysql的默认级别是repeatable read。 隔离级别越高,代价花费越高,性能越低,数据库系统应该根据应用场景选择合适的隔离级别。
例如有些统计工作涉及的数据量巨大,读到一些“脏数据”对最终的统计精度没什么影响,此时就可以降低对一致性的要求以减少系统开销。