1.事务的概念
事务是访问并更新数据库中各种数据项的一个程序执行单元。在事务中的操作,要么都做修改,要么都不修改。
2.事务和锁
当执行事务操作时(dml语句),mysql 会在表上加锁,防止其他用户修改数据。
3.事务的特性:
a.原子性:事务是一个原子操作,它要么全部成功,要么全部失败回滚。
b.一致性:事务的执行必须使数据库从一个一致状态转换到另一个一致状态。
c.隔离性:并发事务的执行不能相互干扰。事务必须在独立的空间内执行,这意味着它们看起来像是在独占访问数据库。
d.持久性:一旦事务完成提交,其结果就是永久性的,并且即使在系统故障的情况下,也必须能够恢复这些结果。
redo log是重做日志,用来保证事务的原子性与持久性,redo 基本上都是顺序写。undo 是回滚日志,用来保证事务的一致性,undo log 需要进行随机操作。
4.事务的隔离级别
事务的隔离级别用于决定如何控制并发用户读写数据的操作,可能会导致脏读、不可重复读、幻读等问题。隔离级别越高,并发访问性能越差。
a.脏读:在不同的事务下,当前事务可以读到另一个事务未提交的数据,简单来说就是可以读到脏数据。脏数据是指事务对缓冲池中行记录的修改,并且还没有被提交。
b.不可重复读:在同一个事务内多次读取同一数据集读取到的结果不一致。脏读是读取到了未被提交的数据,而不可重复度是读取到了已提交的数据。
c.幻读:在同一事务内多次执行相同查询时,可能会看到不同的行数或记录。
5.MVCC 的实现
依赖于: 隐藏字段、Read View、undo log
a.隐藏字段
A 6-byte DB_TRX_ID 用来标识最近一次对本行记录做修改insert 、update) 的事务的标识符,即最后一次改本行记录的事务id.如果是 delete 操作,在lnnoDB 存引内部也属于一次 update 操作,即更新行中的一个特殊位,将行标识为己删除,并非真正删除。
A7-byteDB_ROLL_PTR 回滚指针,指向该行的 undo log。如果该行未被更新,则为空·A 6-byte DB_ROW_ID 如果没有设置主键且该表没有唯一非空索引时,InnoDB 会使用该 id 来生成聚族索引
b.Read View
不同的事务隔离级别中,当有事物在执行过程中修改了数据(更新版本号),在并发事务时需要判断一下版本链中的哪个版本是当前事务可见的。为此InnoDB有了ReadView的概念,使用ReadView来记录和隔离不同事务并发时此记录的哪些版本是对当前访问事物可见的。
c.undo log
除了用来回滚数据,还可以读取可见版本的数据。以此实现非锁定读
6.查看隔离级别
a.查看当前会话层隔离级别
select @@tx_isolation;
b.查看系统隔离级别
select @@global.tx_isolation;
c.设置当前会话层隔离级别
set session transaction isolation level repeatable read;
d.设置系统隔离级别
set global transaction isolation level repeatable read;