1.什么是事务?
是一个逻辑工作单元,这个工作单元中的所有操作,要么都成功,要么都失败
2.事务是如何保证数据的正确性的?
通过事务的四大特性:原子性、一致性、隔离性、持久性
原子性(Atomicity):通过undolog回滚日志实现其原子性
一致性(Consistent):引擎层面使用的是undolog回滚日志以及让mysql具备故障恢复能力的redolog重做日志,服务层面使用的是binlog归档日志
隔离性(Isolation):首先是事务并发带来的问题:脏读、不可重复读、幻读
事务的隔离级别:读未提交(read-uncommitted)、读已提交(RC)、可重复读(RR)、可串行化(serializable)
查看数据库的隔离级别:select @@tx_isolation (mysql数据库的默认级别是repeatable-read)设置就是set tx_isolation=‘serializable’
事务隔离底层实现:锁的设计、MVCC
持久性(Darble):通过redolog重做日志实现
原子性(通过undolog实现-执行回滚)
隔离性(通过锁,MVCC-多版本并发控制)
一致性(通过undolog,redolog,binlog)
持久性(通过redolog日志实现)
3.多个事务并发执行时,可能会带来什么问题?
1)脏读:一个事务读取了其他事务未提交的数据,然后这个数据后面又回滚了
2)不可重复读:一个事务对同样的查询条件进行多次查询时,得到的结果不一致
3)幻读:一个读取到的数据可能是表中不存在的数据
注意:事务的隔离级别越高,并发性可能会越差
4.mysql中的锁是如何分类的?
从性能上可以分为乐观锁和悲观锁
从操作类型上可以分为读锁(共享锁)和写锁(排他锁)
从数据操作粒度上来讲可以分为全局锁、表锁、行锁、间隙锁(between 100 and 200)
5.如何理解MySQL中的全局锁?
全局锁是要关闭所有打开的表。在mysql可以使用全局锁锁定所有表,通常应用于逻辑备份,我们在执行数据库备份时,不允许其他事务对数据库进行更新了,因为这样可能会导致备份的数据与库中实际的数据不一致。
6.MySQL中的全局锁是如何应用的?
加全局读锁(flush table with read lock):只能读库中所有表的数据,但是不能写(insert、delete、update)
解锁(unlock tables)
7.如何对MySQL中的表添加读锁(共享锁)、写锁(排它锁)?
读锁(lock table regions read):所有线程可以读,当前线程写会出错,其它线程写会阻塞。
写锁(lock table regions write):当前线程可以读写,其它线程读写要阻塞。
解锁(unlock tables)
8.如何对MySQL表中的行添加行锁(InnoDB默认select操作不加锁)?
共享锁 (select * from regions where id=13 lock in share mode),又称为S锁,允许当前事务读取一行,阻止其它事务获取相同数据集的排它锁。
排它锁 (select * from regions where id=13 for update),又称为X锁。允许当前事务更新数据,阻止其它事务获取相同数据集的共享锁和排它锁。
9.MVCC是什么?
MVCC(Multi Version Concurrent Control)多版本并发控制,可通过这种方式在保证其性能的基础上实现事务的隔离级别。例如MySQL中的RC、RR事务的隔离级别底层就是通过MVCC实现的。
10.MVCC的底层逻辑是如何实现的呢?
MVCC的实现原理主要依赖于记录中的undolog(回滚日志)、ReadView(快照读)、三个隐藏字段 来实现的
三个隐藏字段:
DB_TRX_ID:记录创建这条记录或者最后一次修改该记录的事务id
DB_ROLL_PTR:回滚指针,指向这条记录的上一个版本,用于配合undolog实现数据的回滚.
DB_ROW_ID:隐藏的主键,如果数据表没有主键,也没有非空且唯一的字段,那么innodb会自动生成一个row_id。
11.如何理解MVCC中的版本链?
当我们开启了一个事务,并且这个是要对数据进行更新,此时会产生一条undolog日志,多个事务同时操作这一条记录时,那就会产生多个版本的undolog日志,这些日志就会通过回滚指针(DB_ROLL_PTR)构建一个链表,这个链表就称之为版本链。
标签:逻辑,Transaction,隔离,undolog,事务,回滚,MVCC,日志 From: https://www.cnblogs.com/yangcrazy/p/17003328.html