目录
1.什么是数据库的事务?
数据库事务(transcation)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。
2.事务的四大特性是什么?
1.原子性:原子性是指包含事务的操作要么全部执行成功,要么全部执行回滚。、
2.一致性:一致性事务在执行前后状态是一致的。
3.隔离性:一个事务所进行的修改在最终提交之前,对其他事务是不可见的。
4.持久性:数据一旦提交,其所作的修改将永久的保存到数据库中。
3.数据库的并发一致性问题
当多个事务并发执行时,可能会出现以下问题:
1.脏读:事务A更新了数据,但是还没有提交,这时事务B读取到事务A更新的数据,然后事务A回滚了,事务B读取到的数据就称为了脏数据了。
2.不可重复读:事务A对数据进行多次读取,事务A在事务B多次读取的的过程中执行了更新操作并提交了,导致事务A多次读取到的数据并不一致。
3.幻读:事务A在读取数据后,事务B向事务A读取的数据中插入了几条数据,事务A再次读取数据时发现多了几条数据,和之前读取的数据不一致。
4.丢失修改:事务A和事务B都对同一个数据进行修改,事务A先修改,事务B随后修改,事务B的修改覆盖了事务A的修改。
不可重复读和幻读看起来很像,他们主要的区别是:在不可重复读中,发现数据不一致主要是数据被更新了。在幻读中,发现数据不一致主要是数据增多了或者减少了。
解决:为了解决并发一致性问题,数据库管理系统通常采用以下几种机制:
-
锁机制:数据库管理系统使用锁机制来避免并发事务之间的冲突。通过对数据对象进行锁定,只有持有锁的事务才能对数据进行读写操作,从而保证数据的一致性和完整性。
-
MVCC机制:MVCC(多版本并发控制)机制是一种基于时间戳的并发控制机制,它通过为每个事务分配唯一的时间戳,并使用版本号来跟踪每个数据对象的历史版本,从而避免并发事务之间的冲突,保证数据的一致性和完整性。
-
串行化隔离级别:串行化隔离级别是一种最严格的隔离级别,它保证了并发事务之间的完全隔离,所有并发事务按照串行化的顺序执行,从而避免了并发一致性问题,但会影响数据库的性能和可扩展性。
4.数据库的隔离级别有哪些?
1.未提交读:一个事务在提交前,他的修改对其他事务也是可见的。
2.提交读:一个事务提交之后,他的修改才能被其他事务看到。
3.可重复读:在同一个事务中多次读取到的数据是一致的。
4.串行化:需要加锁实现,会强制事务串行执行。
数据库的隔离级别分别可以解决数据库的脏读、不可重复读、幻读等问题。
Mysql的默认隔离级别是可重复读。
5.隔离级别是如何实现的?
事务的隔离机制主要是依靠机制的MVCC(多版本并发控制)实现的,提交读和可重复读可以通过MVCC实现,串行化可以通过锁机制实现。
6.什么是MVCC?
MVCC(multiple version concurrent control) 是一种数据库管理系统的并发控制方法,旨在提高数据库系统的并发性能和可扩展性。在MVCC中,每个事务读取的数据都是数据库中的一个版本,而每个版本都有一个时间戳,用于区分不同的版本。事务可以同时读取和写入数据库的多个版本,而不会与其他事务发生冲突。
在了解MVCC时先要了解一个当前读和快照读
1.当前读:读取的是数据库的最新版本,并且在读取的时候要保证其他事务不会修改当前记录,所以会对读取的记录加锁。
2.快照读:不加锁读取操作即为快照读,使用MVCC来读取快照中的数据,避免加锁带来的性能损耗。
可以看到MVCC的作用就是不加锁的情况下,解决数据库读写冲突问题,并且解决脏读、幻读、不可重复读等问题,但是不能解决丢失修改的问题。
MVCC的实现原理:
-
每个数据行都会保存多个版本,并且每个版本都有一个时间戳。
-
当一个事务要读取一行数据时,数据库会检查当前事务的时间戳是否早于该行数据的最新版本时间戳,这样做的目的是保证当前事务读取的数据行的快照已经存在,如果是,则该事务可以读取该行数据。
-
当一个事务要修改一行数据时,数据库会创建一个新版本,并将新版本的时间戳设置为当前时间戳。此时,其他事务仍然可以读取该行数据的旧版本。
-
当一个事务提交时,数据库会将该事务修改的所有数据的时间戳更新为提交时间戳,同时删除早于提交时间戳的所有版本。这样,其他事务就不能再读取或修改这些已经被提交的版本。