1.事务:一系列操作组成的不可分割的工作单位,使数据从一种状态到另一种状态。
ACID特性:
原子性(atom):不可分割
一致性(consistiency):一个合法状态到另一个合法状态
隔离:事务执行过程中不受到其他事务的干扰。—锁来实现
持久:事务提交后,修改应该被保存到库中。
2.脏读,不可重复读,幻读
脏读:A读取B未提交的数据,如果B回滚,则数据无效。
不可重复读:A读取B,但是B更新了字段,导致A读的数据不同。
幻读:A读取B,但是B插入了字段,导致A读取的时候有额外的数据。
3.事务隔离级别:
解决上述问题,并发性带来的数据一致性问题。
四种级别:读未提交,读已提交,可重复度,串行化。
MySQL默认:可重复读:一个事务内多次读取同一行数据的时候,读取的结果相同,导致事务只能读取已经提交的数据,不能读取其他事务未提交的数据。
Q:
1.数据库的事务了解吗
事务:MySQL引擎实现的,一系列不可分割的工作单位,使数据从一组状态到另一组状态
事务的ACID特性:
原子性:事务不可分割。
一致性:从一个合法状态到另一个合法状态
隔离性:执行过程中,不会受到其他事务的干扰,使用锁机制和MVCC实现
持久性:事务提交后,对数据库数据的修改是永久性的。
2.什么是幻读,什么是脏读,什么是不可重复读
脏读:A读取B未提交的数据,如果B回滚,则数据无效。
不可重复读:A读取B,但是B更新了字段,导致A读的数据不同。
幻读:A读取B,但是B插入了字段,导致A读取的时候有额外的数据。
3.什么是隔离级别,不同隔离级别存在的问题,为什么需要不同的隔离级别,隔离级别谁来设置。
多个并发事务执行的时候,会出现脏读、不可重复读、幻读的现象,为了规避这种现象,SQL提供了
四种隔离级别来规避上述问题。隔离级别越高,性能效率就越低。
读未提交,读已提交,可重复度,串行化
- 读未提交:事务A可 以读取到事务B未提交的数据,可能会出现脏读问题。
- 读已提交:事务A只能读取到事务B已经提交的数据,但是在事务A执行期间,事务B可能会更改数据,导致不可重复读问题。
- 可重复读:事务A在执行期间多次读取同一数据,读取的结果应该一致,但是在事务A执行期间,事务B可能会插入或删除数据,导致幻读问题。—MySQL默认隔离级别
- 串行化:所有事务串行执行,不会出现并发问题。
隔离级别可以通过SET TRANSACTION ISOLATION LEVEL
来设置,根据平衡并发性和数据一致性来选择隔离级别。
4.如果希望另一个事务的修改都对当前事务不可见,需要将隔离级别设置什么
串行化,在这个隔离级别下,所有事务串行执行,不会出现并发问题,而且每个事务只能读取已经提交的数据,不能读取其他事务未提交的数据,从而保证了数据的一致性和隔离性。