给每个问题一个最好的答案

最方便的ChatGpt使用方法

Spring的事务隔离是如何做到??

请先 登录 后评论

1 个回答

admin - 书生,情报局长
不是太明白题主的意思,就我目前理解的部分解释一下。

1、spring没有事务和隔离级别的实现,而是依赖于具体数据库里的实现。

spring-tx包里的,其实主要是通过tx-manager去做事务管理,我们一般说是事务管理器。这就说到一个话题,数据库里把事务抽象的很好:

数据库是要用来读写数据的。数据是要保证ACID的。这就产生了事务的概念。事务是数据库核心引擎要干的事儿。同时单线程来读写数据,肯定是不经济的,所以我们需要支持多线程操作(实际上更复杂一点,是多connection*多statement)。多线程同时读写一份数据的时候,就可能发生冲突,从而导致出现了一个新概念:隔离级别。就是说,同样是一个事务,在并发冲突时,我们可以对(性能和一致性)容忍到什么程度。典型的说,1)如果我们不能任何冲突带来的问题,那么只能用串行化Serializable,这时候所有事务请求要单线程排队。2)如果我们可以容忍幻读,那么可以让两个并发事务相互看不到对方的操作,就是Repeatable Read,RR隔离级别。MySQL默认为此级别(其实细节也有不同)。3)如果我们同时可以容忍两个并发事务相互之前在事务提交后可以被对方看到,那么我们可以用Read Committed,RC隔离级别,一般数据库默认为此级别。即如果A先在t1时刻提交,那么B在t1以后的select可以查出来A提交的数据。4)如果我们啥都不管,让这两个事务就像java代码里不做并发控制,两个线程访问和操作同一个变量一样,那就是Read Uncommitted隔离级别。这个大家一般不用,数据可能都是错乱的。对于以上知识,整理如下(https://blog.csdn.net/qq_44829555/article/details/91344859):

事实上,我们可以通过全局参数配置隔离级别全局有效,也可以只针对当前会话设置本次操作事务的隔离级别。

2、现在我们明白了隔离级别是啥,我们再来看一看spring的事务管理器。

数据库虽然提供了事务功能,但是我们如果每次在代码里操作,都需要手工开启和提交、回滚事务,也太不方便了。所以,spring通过AOP封装了事务管理器,同时因为方法调用的嵌套关系,添加了事务传播级别的新概念。

简单讲,我们可以把**/*Service.save*()都定义成事务类方法,这样spring默认就生

请先 登录 后评论