简易的小企业网站建设,杂志网站模板,网站管理 上传模板,qq钓鱼网站在线生成器远离八股文#xff0c;面试大白话#xff0c;通俗且易懂 看完后试着用自己的话复述出来。有问题请指出#xff0c;有需要帮助理解的或者遇到的真实面试题不知道怎么总结的也请评论中写出来#xff0c;大家一起解决。 java面试题汇总-目录-持续更新中 对于这个面试中高频问到…远离八股文面试大白话通俗且易懂 看完后试着用自己的话复述出来。有问题请指出有需要帮助理解的或者遇到的真实面试题不知道怎么总结的也请评论中写出来大家一起解决。 java面试题汇总-目录-持续更新中 对于这个面试中高频问到的问题不知道大家有多少了解。
以前经常会被问道对于事务你有什么了解具体怎么实现
我的回答就很简单在需要实现事务的方法上加上Transactional注解。
显然这只是最基本的实现并没有过了解。所以这篇文章就详细的了解下Spring的事务以及Transactional到底怎么正确使用。 还是从实际面试过程中回答吧不要看着字数多花五分钟相信我~~~每个都是递进的关系读一下很好理解。也不要觉得是不是太大白话了有时候遇到面试官执意探讨的时候就是这个模式......
如果问道这些问题你也能按照下面的方式举例说出来甚至举别的例子就说明基本理解了。 面试官你对spring的事务有多少了解 回答 事务主要是针对一组数据库的操作在这个操作过程中可能涉及到多个业务逻辑或者多张表的修改业务事务管理器会保存每一步的操作最终一起提交commit。要么全部执行成功要么全部执行失败并且回滚到事务最开始的状态。 事务主要包含四个特性原子性、一致性、隔离性、持久性 原子性要求事务过程中的所有操作是一个整体要么全部成功要么全部失败回滚。 一致性是指事务执行前后数据一致。举例来讲A给B转账A和B的总额在数据执行前后应该保持一致A有100B有100事务前总额200A给B转50,事务结束后AB总额200 隔离性即在并发的情况下一个事务的执行不应该对其他事务产生影响这个需要通过隔离级别来实现。 持久性即事务一旦提交成功即使数据库或者系统发生故障也应该正常保存在数据库中。 面试官事务的隔离级别有哪些呢 回答 隔离级别通常是用来应对并发操作的就是多个线程同时对一条数据进行读写可以理解为多个用户同时操作同一条数据常见的隔离级别主要有-读未提交、读已提交、可重复读、串行化。这几个级别对数据的安全性越来越高但是效率会越来越低。 -- 读未提交这是最低级别的隔离。意思就是A事务现在正在修改id1的数据但是因为还有其他业务没有执行完所以还没有commit。此时B事务开启后要获取id1的这条数据而获取的结果就是A事务已经修改后的结果。此时看上去没有问题但是如果A事务在执行后面的逻辑的时候发生了异常那么A事务对于id1这条数据的修改就会被回滚。最终导致B事务获取到的结果就不准确了。这个现象叫做“脏读” -- 读已提交为了解决“脏读”问题特意引入同时也是数据库事务的默认状态。根据名字也能明白就是事务只能读取到其他已经提交了的数据。比如id1的这条数据金额是10此时A事务开始执行并且对id1的数据进行修改成了12因还有其他业务此时还没有提交。这时候B事务开启并且读取id1的这条数据他此时读取到的结果仍然是10。 这样就解决了“脏读”的问题但是并不完美此时又出现了另外一个问题就是“不可重复读”。基于上面的逻辑不可重复读的意思就是B事务开启的时候读取了id1的这条数据结果是10此时是因为A事务还没有提交。但是B事务可能也有很多逻辑要处理在B事务第一次读取id1这条数据结束后A事务提交了这时候id1的数据结果就是12。由于B事务还在处理其他业务正巧需要再次获取id1的这条数据这时候因为隔离级别是读已提交并且A已经提交。所以得到的结果就是12。最终的现象就是B事务在同一个方法中先后两次获取id1的数据得到的结果一次是10 一次是12。这个现象就叫做“不可重复读”。 -- 可重复读为了解决“不可重复读”的问题特意引入。还是原来的场景id1的结果是10A开启事务修改结果为12还没提交。B开启事务第一次查询为10此时A提交事务B再次查询结果还是10。也就是B事务开启的时候id1的这条数据的结果是多少直到B事务结束之前他的结果就还是多少。不会因为其他事务对这条数据修改了就改变查询结果。 但是此时还存在一个比较大的问题就是幻读。什么是幻读呢这个理解起来可能看着和不可重复读差不多但是还是有区别。幻读的意思就是A事务和B事务同时开启了此时B事务查询user表中的数据是10条这时候A事务给user表中添加了一条数据并提交。此时B事务又一次查询user表中的数据得到的结果是11条。两次结果不一致这个就叫做幻读。有人会问我既然已经设置隔离级别是可重复读了为什么还会出现不一致的情况因为隔离级别针对的是单行数据的某个字段是否变化但是对于表的一些聚合统计不受影响比如count()、sum()、max()等等。很气人吧~~~~ -- 串行化这个...这个...就是最高级别的隔离了。串行的意思就是一个事务执行完成后才能开始另外一个事务这样前面几个级别出现的问题就全都解决了。但是执行效率也相对的慢了下来...所以需要根据系统做相映的取舍。 需要注意的是脏读、不可重复读、幻读这几个不是说一个一个出现的比如隔离级别是“读未提交”的时候这三个问题是都存在的只不过针对于它最大的问题就是脏读。同理看下表 二、事务的实现Transactional
那么此时回到标题另一个问题Transactional注解就很好理解了。
基于上面的这么多情况就说明肯定不是直接在方法上加上Transactional就能解决的。
spring事务的实现有编程式事务管理、声明式事务(注解式)
其中编程式事务管理和声明式了解下即可。先说主角Transactional注解
Transactional
这个注解是有很多参数可以配置的具体看下方。用的比较多的就是..好吧除了传播行为和readOnly我个人平时用的比较少其他都有过配置。隔离级别其实也很少改变看具体的业务场景吧。 传播行为定义事务的传播行为即当一个事务方法被另一个事务方法调用时应该如何处理事务 1、Transactional(propagation Propagation.REQUIRED)-默认 如果当前没有事务就新建一个事务如果已经存在一个事务中加入这个事务。如果加入那么不管两个事务逻辑哪个出错全都回滚 2、Transactional(propagation Propagation.REQUIRES_NEW) 每次都新建一个事务挂起当前事务。也就是对当前事务不受影响。新事务失败当前事务不回滚 隔离级别定义事务的隔离级别即多个事务并发执行时事务之间的隔离程度 Transactional(isolation Isolation.READ_COMMITTED) timeout超时时间定义事务的超时时间即事务在多长时间内必须完成。超过指定时间事务将被回滚。单位是秒 Transactional(timeout 60) readOnly 指定事务是否为只读。如果设置为 true表示事务只读取数据但不修改数据这可以优化事务性能 Transactional(readOnly true) rollbackFor 和 noRollbackFor定义在哪些异常情况下回滚事务或者在哪些异常情况下不回滚事务。 Transactional(rollbackFor {SQLException.class, CustomException.class}) 编程式事务管理 了解就好很少使用。
public class MyTransactionService {private TransactionTemplate transactionTemplate;public void setTransactionTemplate(TransactionTemplate transactionTemplate) {this.transactionTemplate transactionTemplate;}public void performTransaction() {transactionTemplate.execute(new TransactionCallbackWithoutResult() {Overrideprotected void doInTransactionWithoutResult(TransactionStatus status) {try {// 事务内的业务逻辑// 模拟某种条件判断是否需要回滚if (someCondition) {// 如果满足条件标记事务为回滚状态status.setRollbackOnly();return;}// 继续事务内的其他业务逻辑} catch (Exception e) {// 发生异常标记事务为回滚状态status.setRollbackOnly();throw e; // 抛出异常触发回滚}}});}
} 声明式事务管理
一般就是在xml文件中或者注解中Transactional其实也属于声明式只不过一般都称为注解式
bean idtransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManagerproperty namedataSource refdataSource/
/beantx:advice idtxAdvice transaction-managertransactionManagertx:attributestx:method name* propagationREQUIRED//tx:attributes
/tx:adviceaop:configaop:pointcut idserviceMethods expressionexecution(* com.example.service.*.*(..))/aop:advisor advice-reftxAdvice pointcut-refserviceMethods/
/aop:config