事务是关系型数据库的重要特性。它是一个包含了一条或多条SQL语句的逻辑原子单元。一个事务包含的SQL要么全部提交,要么全部回滚。

Oracle 官方文档中对事务的描述如下:

A transaction is a logical, atomic unit of work that contains one or more SQL statements. 
A transaction groups SQL statements so that they are either all committed, which means they are applied to the database, or all rolled back, which means they are undone from the database.

而ACID特性是事务必须满足的。ACID是Atomicity,Consistency,Isolation,Durability四个单次的首字母缩写。

Atomicity (原子性):

事务的所有任务都被执行,或者一个也不执行。没有部分交易。

Consistency (一致性):

事务将数据库从一个一致的状态带到另一个一致的状态。

Isolation (隔离性):

在事务提交之前,事务的效果对其他事务是不可见的。

Durability (持久性):

提交的事务所做的更改是永久性的。事务完成后,数据库确保事务中的更改不会丢失。

事务的隔离级别和几种可能存在的问题

脏读

在一个事务中读取到另一个未提交事务中的修改操作。

不可重复读

在一个事务中前后两次相同查询读取到的数据不一致(另一个事务对数据进行了修改并提交)。

幻读

在一个事务中前后两次相同查询渠道的数据量不一致(另一个事务对进行了插入或删除操作并提交)。

很多文章中说 MySQL 的 RR 隔离级别通过 MVCC 避免了出现幻读,这是不准确的。
MVCC 确实避免了两次 select 获得结果的不一致,但是这时候如果进行主键冲突的 insert 操作(隐式查询),就会提示主键冲突。
这就是幻读的魔幻点:查出来的结果告诉我主键不冲突,可以插入,但是实际插入时却操作不成功。
具体实验请看以下文章:
https://www.cnblogs.com/rayso/p/12162699.html

从上面可以看出,事务隔离级别越高(由上往下依次增高),越不会出现问题,但是相应的并发性能就会越低。高等级的隔离级别是通过更加严格的锁来保证的。

MySQL默认的隔离级别是Repeatable read;Oracle默认的隔离级别是Read committed。

MVCC (Multi Version Concurrent Control)

通过UNDO实现,保障隔离性

WAL (Write Ahead Log)

通过REDO实现,保障持久性

最新文章

  1. zigbee 路由节点丢失后清除 该节点的残余网络信息
  2. 安全协议系列(三)----CCMP与WPA-PSK
  3. odoo-10.0 create database 失败
  4. opencv 连通域需要的函数解析
  5. xmf 翻译
  6. C/C++取出变量的每一位的值(第一次知道还有QBitArray)
  7. QSqlDatabase::addDatabase第一次运行的时候,生成SQLite文件的同时会产生一个默认连接
  8. 关于MySql中自增长id设置初始值
  9. 在不同环境下MD5加密相同字符串,密文不一样的问题
  10. Dynamics CRM 日常使用JS整理(三)
  11. 清北学堂 清北-Day1-R2-监听monitor
  12. easyui 布局之window和panel一起使用时,拉动window宽高时panel不跟随一起变化
  13. Ajax增删改查-----------删 改
  14. [转] js在浏览器端对二进制流进行AES加密和解密
  15. Oracle清理回收站的方法
  16. java⑦
  17. NumPy Ndarray 对象
  18. 批处理(.bat脚本)基本命令语法
  19. Java之spilt()函数,trim()函数
  20. w3school前端教程合集

热门文章

  1. 谷歌BERT预训练源码解析(三):训练过程
  2. 在VirtualBox下安装linux操作系统
  3. oracle 用TRUNCATE替代DELETE
  4. CSS属性Display(显示)和Visibility(可见性)
  5. vue 项目编译打包
  6. [转]安卓加固之so文件加固
  7. 2019-10-24-dotnet-列表-Linq-的-Take-用法
  8. SpringBoot2.X 项目使用外置绝对路径的配置文件
  9. P1021 整数奇偶排序
  10. post提交方式为什么要序列化,而Get提交方式就不用?序列化做了什么?