是数据库区别于文件系统的重要特性之一,用于保证数据库的完整性,数据库会从一种一致性状态转换为另一种一致性状态。
1、四大特性
(1) 原子性
数据库的每个事务都是不可分割的单元,只有事务中的所有 SQL 语句都执行成功,才算整个事务成功,如果事务中有一个 SQL 语句执行失败,整个事务都将回滚。
(2) 一致性
数据库从一种一致性状态转换为另一种一致性状态,即数据库的完整性约束没有被破坏,要么都是新数据,要么都是老数据。
(3) 隔离性
一个事务的影响在该事务提交之前对其他事务都是不可见的,通过锁机制来实现。
(4) 持久性
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
2、语法:
在 MySQL 命令行默认设置下,事务是自动提交的,即执行了 SQL 语句之后马上会执行 commit 操作,可以通过 set autocommit = 0 来禁用当前会话的自动提交。
(1) 开始事务
begin 或 start transaction
(2) 提交事务
commit,即 commit [work]
(3) 事务回滚
rollback,即 rollback [work]
(4) 定义保存点
savepoint xxx,一个事务中可以有多个保存点
(5) 删除保存点
release savepoint xxx,保存点不存在时会抛出异常
(6) 回滚到某个保存点
rollback to [savepoint] xxx
回滚到某个保存点并不能让事务结束,要提交事务或回滚事务。
3、InnoDB 的实现
隔离性由锁机制实现,原子性、一致性、持久性都是通过数据库的 redo 日志和 undo 日志来完成。
redo 日志:重做日志,它记录了事务的行为;
undo 日志:对数据库进行修改时会产生 undo 日志,也会产生 redo 日志,使用 rollback 请求回滚时通过 undo 日志将数据回滚到修改前的样子。
InnoDB 存储引擎回滚时,它实际上做的是与之前相反的工作,insert 对应 delete,delete 对应insert,update 对应相反的 update。
ps:
1、commit 和 commit work 的区别
commit work 可以控制事务接收后的行为,可以用 select @@completion_type 查看值,默认是0。
completion_type = 0,两者等价。
completion_type = 1,commit work 等价于 commit and chain,表示马上开启一个相同隔离级别的事务。
completion_type = 2,commit work 等价于 commit and release,表示事务提交后自动断开与服务器的连接。
2、隐式提交
有些语句会造成隐式提交,主要有3类:
(1) DDL 语句:create event、create index、alter table、create database、truncate 等等,所有 DDL 语句都是不能回滚的。
(2) 权限操作语句:create user、drop user、grant、rename user 等等。
(3) 管理语句:analyze table、check table 等等。
3、隔离级别
通过锁机制实现,大部分数据库都没有提供真正意义上的隔离性。
数据库制造商在标准和性能之间进行了权衡,MySQL 还是比较贴近该标准的,ISO 和 ANSI SQL 标准了四种事务隔离级别的标准。
可以用 select @@tx_isolation 来查看它的值。
(1) read uncommitted
隔离级别最低,开销也是最小,目前没有数据库会设置它为默认隔离级别,因为会出现脏读。
脏读:读到未提交的数据(脏数据),n 事务中读到 m 事务中修改了,但未提交的数据,即在不同事务下可以读到其它事务未提交的数据。
严格来说,它已经破坏了事务的隔离性。
(2) read committed
它不允许在别的事务未提交时读取到别的事务的修改数据,容易出现不可重复读,但是可以被人们接受,因为事务已经提交,数据已经持久化到磁盘了,隔离级别越低,事务请求的锁就越少,或者保持锁定的时间就越短,这也是大多数数据库默认的事务隔离级别都是 read committed 的原因。
不可重复读:在一个事务中多次读同一个数据,由于其他事务在第一个事务还没结束时修改了数据,造成第一个事务中两次读到的数据不一致。
脏读与不可重复读:脏读读取的是未提交的数据,不可重复读读到的是已提交的数据。
(3) repeatable read
InnoDB 存储引擎默认支持的隔离级别。不会出现脏读、不可重复读和幻读(InnoDB 避免了该问题)。
(4) serializable
SQL 和 SQL2 标准的默认事务隔离级别,它是真正意义上的隔离,当然性能也是最差。
设置事务隔离级别:
set [global|session] transaction isolation level {read uncommitted|...};
比如:set tx_isolation='read-committed';
- 数据库
- CAP定理
- 关系模型
- 关系数据库
- NoSQL
- ODBC
- JDBC
- ODBC、JDBC和四种驱动类型
- mysql
- 安装与配置
- CentOS 7 安装 MySQL
- 优化
- 比较全面的MySQL优化参考
- 1、硬件层相关优化
- 1.1、CPU相关
- 1.2、磁盘I/O相关
- 2、系统层相关优化
- 2.1、文件系统层优化
- 2.2、其他内核参数优化
- 3、MySQL层相关优化
- 3.1、关于版本选择
- 3.2、关于最重要的参数选项调整建议
- 3.3、关于Schema设计规范及SQL使用建议
- 3.4、其他建议
- 后记
- Mysql设计与优化专题
- ER图,数据建模与数据字典
- 数据中设计中的范式与反范式
- 字段类型与合理的选择字段类型
- 表的垂直拆分和水平拆分
- 详解慢查询
- mysql的最佳索引攻略
- 高手详解SQL性能优化十条经验
- 优化SQL查询:如何写出高性能SQL语句
- MySQL索引原理及慢查询优化
- 数据库SQL优化大总结之 百万级数据库优化方案
- 数据库性能优化之SQL语句优化1
- 【重磅干货】看了此文,Oracle SQL优化文章不必再看!
- MySQL 对于千万级的大表要怎么优化?
- MySQL 数据库设计总结
- MYSQL性能优化的最佳20+条经验
- 数据操作
- 数据语句操作类型
- DCL
- 修改Mysql数据库名的5种方法
- DML
- 连接
- 连接2
- DDL
- 数据类型
- 字符集
- 表引擎
- 索引
- MySQL理解索引、添加索引的原则
- mysql建索引的几大原则
- 浅谈mysql的索引设计原则以及常见索引的区别
- 常用工具简介
- QA
- MySQL主机127.0.0.1与localhost区别总结
- 视图(view)
- 触发器
- 自定义函数和存储过程的使用
- 事务(transaction)
- 范式与反范式
- 常用函数
- MySQL 数据类型 详解
- Mysql数据库常用分库和分表方式
- 隔离级别
- 五分钟搞清楚MySQL事务隔离级别
- mysql隔离级别及事务传播
- 事务隔离级别和脏读的快速入门
- 数据库引擎中的隔离级别
- 事务隔离级别
- Innodb中的事务隔离级别和锁的关系
- MySQL 四种事务隔离级的说明
- Innodb锁机制:Next-Key Lock 浅谈
- SQL函数和存储过程的区别
- mongo
- MongoDB设置访问权限、设置用户
- redis
- ORM
- mybatis
- $ vs #
- mybatis深入理解(一)之 # 与 $ 区别以及 sql 预编译
- 电商设计
- B2C电子商务系统研发——概述篇
- B2C电子商务系统研发——商品数据模型设计
- B2C电子商务系统研发——商品模块E-R图建模
- B2C电子商务系统研发——商品SKU分析和设计(一)
- B2C电子商务系统研发——商品SKU分析和设计(二)
- 数据库命名规范--通用