面试篇:面试时经常会被问起的mysql事务问题

135 阅读2分钟

本文目录:

image.png

什么是事务

事务就是一次不可再分的操作

事务的四大特性是什么

原子性

一次不可再分的操作,事务中包含的操作 要成功都成功,要失败都失败

隔离性

一个事务不能被另外一个事务 干扰

持久性

事务的提交,对那么数据的操作就是永久性的

一致性

事务对数据的改变必须是从一个一致状态到另一个一致状态的改变

事务的隔离级别

读取已提交数据

会出现不可重复读和幻读

读取未提交数据

会出现脏读,不可重复读(基本不再使用)

可重复读(默认为可重复读)

会出现幻读

串行化

事务的并发状态下会出现哪些问题

脏读

一个事务读到另一个事务未提交更新的数据

例:[B事务提交数据 ,A事务查询,B事务回滚 A事务再次查询 A事务发现两次查询结果不一致]

幻读

一个事务读取到另一个事务已提交的 插入/删除的数据

例:[A事务查询,B事务插入或者删除,A事务再次查询 发现两次查询的数据结果不一致]

不可写重复读

一个事务读取到另一个事务已提交的更新数据

例:[A事务查询,B事务更新,A事务再次查询 发现两次查询结果不一致]

丢失更新

一个事务的撤销把其他事务的更新提交数据覆盖掉

例:[A事务更新数据,B事务在A事务后也去更新数据该数据,A事务回滚,然后把B事务更新的数据也回滚掉了]

覆盖更新

一个事物的提交把其他事务已提交更新数据覆盖掉

例:[A事务更新, B事务也去对该条数据更新,A事务发现自己更新的数据被覆盖掉了]

在spring中一些关于事务的知识点

在Spring中事务有哪些传播行为

Transactional(propagation=Propagation.REQUIRED)

如果有事务,    那么加入事务,    没 有的话新建一个(默认情况下) 

@Transactional(propagation=Propagation.NOT_SUPPORTED)

容器不为这个方法开启事务 

@Transactional(propagation=Propagation.REQUIRES_NEW)

不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务 

@Transactional(propagation=Propagation.MANDATORY)

必须在一个已有的事务中执行,否则抛出异常 

@Transactional(propagation=Propagation.NEVER)

必须在一个没有的事务中执行,否则抛出异常(与  Propagation.MANDATORY 相反) 

@Transactional(propagation=Propagation.SUPPORTS)>

如果其他  bean  调用这个方法, 在其他bean 中声明事务,那就用事务.如果其他bean  没有声明事务,那就不用事务.