JAVA基础
Spring框架
1、什么情况下@TranSaction注解会失效?什么情况下Spring事务不会回滚?
- spring事务默认情况下只会回滚RuntimeException(运行时异常)和Error(错误),对于普通的Exception(非运行时异常)不会回滚
解决办法:rollbackFor = Exception.class
- 开发人员手动抛了或捕获处理了异常,事务同样不会回滚
- 如果在同一个类内部直接调用被注解的方法,事务注解将不会生效,因为不是通过代理对象调用的方法
如果确实想调用另一个方法,在Service类中注入自己,或AopContext.currentProxy()获取代理对象
- spring通过数据库连接来实现事务。用在多线程场景中,不同的线程数据库连接不一样
- 注解作用的方法不是公有的
- 方法被final修饰
- 数据库引擎如果是MyISAM,不支持事务
手动实现的AOP切面方法报错了,会影响业务接口吗
答:会。不管是切面方法出现异常还是业务方法出现异常,都会抛异常。所以要视业务场景考虑捕获异常还是抛出异常。
数据库
1、count(*)、count(1) 和 count(字段)有什么区别?
- count(
*
)和count(1) 会对结果集中的每一行进行计数,包括重复的行和含有 NULL 值的行。count(1)是一种常见的优化写法,它与 count(*) 的功能相同,但是在计算行数时使用了一个常量值1,而不是对每一行进行解析和计数。因为只是统计行数而不需要具体的列数据,使用 count(1) 可以提高性能。但count(*
) 和 count(1) 通常在实际应用中没有明显的性能差异,因为现代数据库管理系统对它们进行了优化,实际执行时的差异很小。 - count(字段) 用于计算指定字段中的非 NULL 值的行数。它会对指定的字段进行非 NULL 值的计数,忽略 NULL 值。