事务及其ACID属性
事务:
一组操作要么全部成功,要么全部失败,目的是为了保证数据最终的一致性(比对并发编程中的原子性)
ACID属性:
-
原子性(Atomicity)
当前事务的操作,要么同时成功,要么同时失败。
原子性由undo log日志来实现 -
一致性(Consistent)
使用事务的最终目的,由其他3个特性以及业务代码正确逻辑来实现
事务前后,数据应该是一致的 -
隔离性(Isolation)
事务并发执行时,他们内部的操作不能相互干扰。
隔离性由各种锁以及MVCC机制来实现。 -
持久性(Durable)
一旦提交了事务,它对数据库的改变就应该是永久性的。
持久性由redo log日志来实现
并发事务处理带来的问题:
脏读
事务A读到了事务B已经修改但还未提交的数据不可重复读
事务A内部的相同查询语句在不同时刻读出的结果不一致幻读
事务A读到了事务B提交的新增数据
事务隔离级别:
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
| 读未提交 Read Uncommitted | 可能 | 可能 | 可能 |
| 读已提交 Read Committed | 不可能 | 可能 | 可能 |
| 可重复读 Repeatable Read | 不可能 | 不可能 | 可能 |
| 串行化 Serializable | 不可能 | 不可能 | 不可能 |
-
读未提交
事务A读到了事务B已经修改但还未提交的数据 -
读已提交
事务A可以读取到事务B已经提交的数据 -
可重复读
事务A在事务过程中,读取到的数据是一致的 -
串行化
事务A与事务B对相同数据的读和写操作都要并行执行。
事务的串行化,是由各种锁来实现的
读锁:共享锁,针对同一份数据,多个读操作可以同时进行而不会相互影响
写锁:排它锁,针对同一份数据,会阻断其他写锁、读锁
间隙锁:锁的是两个值之间的空隙,间隙锁在可重复读隔离级别下才会生效
Mysql5.7版本:
查看当前数据库的事务隔离级别:show variables like 'tx_isolation';
设置事务隔离级别:set tx_isolation='REPEATABLE-READ';
Mysql8.0版本:
查看当前数据库的事务隔离级别:show variables like '%isolation%';
设置事务隔离级别:set transaction_isolation='REPEATABLE-READ';
Mysql的默认隔离为:可重复读
Oracle的默认隔离级别为:读已提交
大事务的影响:
-
并发情况下,数据库连接池容易被撑爆
-
锁定太多数据,造成大量阻塞和锁超时
-
执行时间长,容易造成主从延迟
-
回滚所需要的时间比较长
-
undo log膨胀
-
容易导致死锁
事务优化:
-
将查询等数据准备操作放到事务外
-
事务中避免远程调用,远程调用要设置超时,防止事务等待时间太久
-
事务中避免一次性处理太多数据,可以拆分成多个事务分次处理
-
事务等设计加锁的操作尽可能放在实物靠后的位置
-
能异步处理的尽量异步处理
-
应用侧(业务代码)保证数据一致性,非事务执行
MySQL事务原理与优化方法
1998

被折叠的 条评论
为什么被折叠?



