1.事务主要是用来做什么的?
主要是对数据库进行事务管理,spring的事务主要是用来管理spring所加载的ORM框架(例如:Hibernate、Mybatis、MybatisPlus······)起到对程序里面数据进行持久化,提高运行速度。
2.spring事务管理的步骤:
第一步:注解@Transactional(对事物的一些描述参数也叫属性,例如事务响应的时间和优先级)标识,spring自动扫描此类注解、标识。(springcloud里已屏蔽此技术)
第二步:spring一旦启动的时候会去解析生成bean,这个过程会检测拥有相关注解的类和方法,同时给带有此事务的类或者方法生成相应的代理。
3.关于@Transactional的注解属性都有哪些?
value:可选的限定描述符,制定使用的事务管理器(默认的的事务管理器)
propagtion:可选的事务传播行为设置(经常使用)
isolation:可选的事务隔离级别设置(经常使用)
readOnly:读写或只读事务
timeout:事务超时时间设置;单位ms(毫秒)
rollbackFor:导致事务回滚的异常类名字数组
oRollbackFor:不会导致事务回滚的
noRollbackForClassName:不会导致事务回滚的异常类的名字数组
4.propagtion注解详解,各属性值的含义
可选的事务传播行为设置(经常使用)
首先在ServiceImpl里开启事务
@Transactional(propagation = )
各属性值的含义:
REQUIRED:如果有事务,那么加入事务;如果没有事务,创建一个事务;
NOT_SUPPORTED:这个方法不开启事务
REQUIREDDS_NEW:不管有没有事务的存在都创建一个新的事务来执行,原来事务挂起
MANDATORY:必须在一个已有事务中执行
NEVER:不能在一个事务中执行,就是当前必须没有事务的情况下,否则跑出异常
SUPPORTS:如果当前存在事务,则在事务中运行;否则以非事务形态运行
NESTED:若当前存在事务,则再运行一个嵌套的事务;若当前没有事务,则按照REQUIRED的方式运行;如:
5.isolation注解详解,各属性值的含义
可选的事务隔离级别设置(经常使用)
TransactionDefinition.ISOLATION_DEFAULT:这是默认值,表示使用底层数据库的默认隔离级别
TransactionDefinition.ISOLATION_READ_UNCOMMITTED:该隔离级别表示一个事务可以读取另一个事务修改但是没有提交的数据,该级别不能防止脏读数据,不可重复读和幻读,因此很少使用该隔离级别
TransactionDefinition.ISOLATION_READ_COMMITTED:该隔离级别表示一个事务只能读取另一个事务已经提交的数据,该级别可以防止脏读数据,这也是大多数情况下的推荐隔离级别
TransactionDefinition.ISOLATION_REPEATABLE_READ:该事务隔离级别表示一个事务在整个过程中可以重复执行某个查询,并且每次返回的记录都相同,该级别可以防止脏读数据和不可重复读;
TransactionDefinition.ISOLATION_SERIALLABLE:所有的事务依次逐个执行,这样事务之间就完全不可能进行干扰,也就是说,该级别可以防止脏读、不可重复读及幻读,但是这将影响到程序的运行性能,通常情况下也会用到该级别
6.名词解释-脏读(超前)
当事务读取还未提交的事务时,就会发生脏读
例如:A修改了一条数据未提交,B读取了A修改但没提交的数据叫事务脏读,A修改的又改了叫事务回滚。
7.名词解释-幻读(落后)
就是读取到了历史数据,即使此数据已经被修改了,那么也会读到修改前的数据
8.事务模板
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="find*" propagation="NOT_SUPPORTED"
read-only="true" />
<tx:method name="select*" propagation="NOT_SUPPORTED"
read-only="true" />
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
所以写了这个,之后写数据库方法时就得用find或者select开头来命名