一、原子性(Atomicity)、一致性(Consistent)、隔离性(Isalotion)、持久性(Durable),简称为ACID。
1.原子性(Atomic)
一个事务包含多个操作,这些操作要么全都执行,要么全都不执行,初中物理:原子是构成事物的最小单元,实现主要基于undo log。
2.一致性(Consistency)
事务使得系统从一个一致的状态转换到另一个一致的状态,实现主要基于redo log。
3.隔离性(Isolation)
事务间的读写靠MySQL的锁机制来保证隔离,事务间的写操作靠MVCC机制(快照读、当前读)来保证隔离性;MVCC全称是【Multi-Version ConCurrency Control】即多版本控制协议。
4.持久性(Durability)
事务的最终目的,即需要数据库层面保证,又需要应用层面进行保证,并且MySQL底层通过两阶段提交事务保证了事务持久化时的一致性(先刷写dolog日志,再进行page buffer刷写OS buffer再刷写到磁盘 或绕过OS buffer 直接刷到磁盘)。
page buffer刷写通过Innodb_flush_method控制
Innodb_flush_method=fsync 日志和数据缓冲区写磁盘,都走OS buffer(默认)
Innodb_flush_method=O_DIRECT 数据缓冲区写磁盘,不走OS buffer 日志走os buffer
Innodb_flush_method=O_DSYNC 日志缓冲区写磁盘,不走 OS buffer 数据走osbuffer
二、隔离级别
- Read uncommitted:读取未提交,其他事务只要修改了数据,即使未提交,本事务也能看到修改后的数据值。
- Read committed:读取已提交,其他事务提交了对数据的修改后,本事务就能读取到修改后的数据值。
- Repeatable read:可重复读,无论其他事务是否修改并提交了数据,在这个事务中看到的数据值始终不受其他事务影响(默认)。
- Serializable:串行化,一个事务一个事务的执行(效率低)。
# 未提交读级别
set session transaction isolation level read uncommitted;
# 已提交读级别
#全局
set global tx_isolation = 'READ-COMMITTED'
set global transaction isolation level read committed;
#会话
set tx_isolation = 'READ-COMMITTED'
set session transaction isolation level read committed;
# 可重复读级别(默认)
#全局
set global tx_isolation = 'REPEATABLE-READ'
set global transaction isolation level repeatable read;
#会话
set tx_isolation = 'REPEATABLE-READ'
set session transaction isolation level repeatable read;
# 可串行化级别(执行效率慢)
set session transaction isolation level serializable;