MySQL事务和隔离机制
1. 事务
由一组相关的dml语句组成,该组dml语句要么全部成功,要么全部失败
1.1 事务作用
- 用于保证数据的一致性
1.2 事务和锁
- 当执行事务操作时,MySQL会在表上加锁,防止其他用户更改表中数据
1.3 事务操作
- 开始一个事务:
START TRANSACTION
- 设置保存点:
SAVEPOINT [保存点名]
- 回退事务到某个保存点:
ROLLBACK TO [保存点名]
- 回退全部事务:
ROLLBACK
- 提交事务:
COMMIT
(提交后,所有操作不可回退)
注: 事务commit后,会自动删除事务中的所有保存点,从当前保存点回退到上一个保存点,当前保存点会被自动删除
1.4 事务注意事项
- 默认情况下,dml操作是自动提交的,不能回滚
- 开始一个事务,但没有创建保存点,执行rollback,默认回退到事务开始的状态
- 可以在事务中创建多个保存点
- 在事务没有提交前,可以选择回退到哪个检查点
- MySQL事务机制需要InnoDB的存储引擎才可以使用
- 开始事务 START TRANSACTION, SET AUTOCOMMIT = off
1.5 MySQL事务ACID
- 原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都执行,要么都不执行 - 一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另一个一致性状态 - 隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,事务为每一个用户开启的事务,不能被其他事物的操作数据干扰,并发多个事务之间要相互隔离 - 持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
2. 隔离机制
多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性
2.1 四种隔离级别
脏读: 一个事务读取另一个事务未提交的改变(UPDATE,INSERT,DELETE)
不可重复读: 一个事务中进行多次查询,因为其他提交事务的修改或删除操作,导致每次查询到的数据都不一样,此时发生不可重复读
幻读: 一个事务中进行多次查询,因为其他提交事务的插入操作,每次查询到的数据不同,此时发生幻读
MySQL隔离级别定义了事务与事务之间的隔离程度
MySQL隔离级别(4种) | 脏读 | 不可重复读 | 幻读 | 加锁读 |
---|---|---|---|---|
读未提交(Read uncommitted) | ✓ | ✓ | ✓ | 不加锁 |
读已提交(Read committed) | ✗ | ✓ | ✓ | 不加锁 |
可重复读(Repeatable read) | ✗ | ✗ | ✗ | 不加锁 |
可串行化(Serializable) | ✗ | ✗ | ✗ | 加锁 |
2.2 设置隔离级别的方法
- 查看会话隔离级别
SELECT @@tx_isolation
- 查看系统当前隔离级别
SELECT @@global.tx_isolation
- 设置当前会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL [隔离级别]
- 设置系统当前隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL [隔离级别]
注: MySQL默认的隔离级别是REPEATABLE READ,没有特殊要求,一般不修改
全局修改,修改my.ini配置文件,在最后加上
[mysqld]
transaction-isolation = REPEATABLE-READ
//可选参数有:READ-UNCOMMITTED,READ-COMMITTED,REPEATABLE-READ,SERIALIZABLE
标签:事务,加锁,隔离,提交,MySQL,级别 来源: https://www.cnblogs.com/digger72/p/15575216.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。