1.事务与数据库链接的占用
如果用@Transactional注解,那在第一次与数据库交互的时候,就会打开数据库链接,再整个方法执行完,才会关闭数据库链接。
即使后边用的事务传播是required_new,那之前的事务也是被挂起,不会被关闭,也是占用了数据库链接。
所以为了防止链接占用时间过长,最好不要在被@Transactional修饰的方法中,做文件处理或者是操作redis
可以像下边那样写
//MethodA不被@Transactional修饰
MethodA(){MethodB();//被@Transactional修饰的方法,注意B方法和A方法不能在同一个类中MethodC();//文件处理,或者操作redis
}
或者,使用编程式事务。execute执行完,数据库链接就会关闭。
@Transactional是注解式事务,TansactionTemplate是注解式事务
2.事务传播
- REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
- 这是新创建了一个数据库链接Connection,新事务完成后就关闭那个数据库链接
- NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前不存在事务,则创建一个新的事务。如果主事务提交,则提交所有的嵌套事务。如果任何一个嵌套事务失败,则回滚所有的嵌套事务,但不影响主事务的提交。
- 这个数据库链接用的还是原来的,但是新建了savepoint。如果嵌套事务执行失败,就回滚到指定的savepoint
- 因为外层事务的savepoint在更前边,所以嵌套事务不影响外层事务,但是外层事务回滚时,子事务也回滚。
总结
加入事务(REQUIRED)和嵌套事务(NESTED)都是事务传播机制中的两种传播级别,如果当前不存在事务,那么二者的行为是一致的;但如果当前存在事务,那么加入事务的事务传播级别当遇到异常时会回滚全部事务,而嵌套事务则是回滚部分事务。嵌套事务之所以能回滚部分事务,是因为数据库中存在一个保存点的概念,嵌套事务相对于新建了一个保存点,如果出现异常了,那么只需要回滚到保存点即可,这样就实现了部分事务的回滚。
Nested事务传播的模拟
3.spring如何处理事务
1. spring检查当前方法以及类上有没有@transactional注解
2. 事务开启后,会在连接中关闭数据库的自动提交
3. 非public得方法,事务不生效,因为spring无法生成代理对象
这是spring源码
4.spring的切面
1.代理模式
这是spring源码
2.切面加载排序
如果注解相同,比如同为@Before,那就按照代码编写顺序
5.要实例化一个类必须有beandefinition
6.前后端交互逻辑
1.url匹配
后端启动的时候就把被@Controller修饰的类加载出来,并且找到类上边的@RequestMapping和方法上的@RequestMapping,两个url拼接,形成完整的url
下边是源码
2.返回的时候,不一定使用到视图解析器
在Spring MVC中,如果你的控制器方法只返回字符串或者JSON串(通常作为RESTful API的响应),通常不需要配置视图解析器(ViewResolver)。
视图解析器主要用于将控制器方法返回的逻辑视图名称解析为实际的视图(如JSP、Thymeleaf模板等),然后渲染到客户端。但是,如果你的方法直接返回字符串或者JSON数据,Spring会将这些数据写入HTTP响应体中,而不是尝试解析为视图。
### 返回字符串
如果你的控制器方法返回一个普通的字符串,Spring MVC将直接将这个字符串作为HTTP响应的内容返回给客户端,而不会将其解析为视图。例如:
```java
@RequestMapping("/hello")
@ResponseBody
public String hello() {
return "Hello, World!";
}
```在这个例子中,`@ResponseBody`注解告诉Spring MVC将方法的返回值直接作为HTTP响应的主体内容,而不会通过视图解析器来渲染。
### 返回JSON
如果你的控制器方法返回一个对象,并且希望将其转换为JSON格式返回给客户端,通常使用`@RestController`注解更为方便,它结合了`@Controller`和`@ResponseBody`的功能。例如:
```java
@RestController
public class ExampleController {@RequestMapping("/user")
public User getUser() {
User user = new User("John Doe", 30);
return user;
}
}
```在这个例子中,Spring MVC会自动将`User`对象转换为JSON格式,并将其作为HTTP响应的内容返回给客户端,而不需要视图解析器的参与。
因此,当你的控制器方法仅返回字符串或者JSON数据时,视图解析器是不必要的。相反,Spring MVC会根据方法的注解(如`@ResponseBody`或`@RestController`)来直接处理返回的数据。
3.前端header中的Accept与后端的produces对比
7.如何注入所有子类
8.spring中${}和#{}
9.算法相关
1.双指针
2.同构字符串
3.二叉树最大深度
4.有序数组转为二叉搜索树
二叉搜索树的 左<根<右
5.二进制逐位颠倒
>>>无论如何都补0,>>如果有符号位补符号位
1.我的解决办法
6.异或^=
两数相同,异或为1
1和任何数n异或,结果为n
7.二叉搜索树两个节点公共祖先
因为二叉搜索树满足 左<根<右
所以可以分别求两个节点路径
当路径不同时,前一个值就是公共祖先
10.字符串在内存中的分配
11.java1.8后map扩容算法
(n - 1) & hash 在计算机科学中经常用于快速计算 hash 值在数组(或哈希表)中的索引位置
这里的 n 通常是数组的长度,而 hash 则是计算出来的哈希值。