spring多线程事物解决办法

在项目中遇到多线程环境下事务无法正常回滚的问题,即使在方法上添加了事务注解。主线程中的事务操作仍能生效。为解决此问题,可以采用SpringBoot的上下文获取方式,配置自定义事务管理器,并结合JdbcTemplate和TransactionManager来实现多线程事务控制。
摘要由CSDN通过智能技术生成

1、最近做项目使用了多线,但是发现多线程事务无法起作用,就是多线程运行时每个线程的方法虽然加了事务的注解但是数据插入依旧不会回滚

2、此时主线程操作数据插入事物是起作用的。

springboot 解决办法

    先获取spring的context

    配置中 添加事物管理器1

package luculent.fupin.tools;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class SpringUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext = null;

    @Override

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException{

        if (SpringUtil.applicationContext == null) {

            SpringUtil.applicationContext = applicationContext;

        }
    }

    // 获取applicationContext

    public static ApplicationContext getApplicationContext(){

        return applicationContext;

    }

    // 通过name获取 Bean.

    public static Object getBean(String name){

        return getApplicationContext ().getBean (name);

    }

    // 通过class获取Bean.

    public static <T> T getBean(Class<T> clazz){

        return getApplicationContext ().getBean (clazz);

    }

    // 通过name,以及Clazz返回指定的Bean

    public static <T> T getBean(String name,Class<T> clazz){

        return getApplicationContext ().getBean (name, clazz);

    }

}
import java.util.Properties;

import javax.sql.DataSource;

import org.springframework.boot.bind.RelaxedPropertyResolver;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Co
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MyBatis是一个强大的持久层框架,它通过配置和SQL映射提供了一种简化与数据库交互的方式。关于多线程下的事物一致性,在MyBatis中主要体现在如何管理事务、并发访问和数据的一致性。 ### MyBatis事务隔离级别 MyBatis支持多种事务隔离级别,包括但不限于: 1. **未提交读**:这是最低级别的隔离,可能导致脏读和不可重复读的问题。 2. **已提交读**:保证了事务的原子性和持久性,但在某些场景下可能会导致不可重复读。 3. **可重复读**:解决了不可重复读的问题,但可能导致幻读现象。 4. **串行化**:最高级别的隔离,避免了所有的异常行为,但效率较低。 ### 多线程环境下事务处理策略 在多线程环境中,MyBatis通常需要借助于Spring等容器提供的事务管理功能来协调多个线程之间的事务操作。这里有一些关键点需要注意: 1. **独立事务管理**:每个线程都应有自己的事务管理上下文,确保线程间的事务不会相互影响。 2. **分布式事务解决方案**:对于跨多个数据库或服务的操作,MyBatis可能无法直接处理,这时需要使用如TCC(Try Confirm Cancel)、两阶段提交(2PC)或其他分布式事务协议解决。 3. **乐观锁和悲观锁**:为了避免冲突,尤其是在高并发环境下,可以利用MySQL的数据引擎特性(如InnoDB),配合MyBatis的`selectForUpdate()`等方法实现悲观锁定;或者使用版本控制等机制实现乐观锁定。 ### 实现示例 假设在一个多线程应用中,有多个线程需要更新同一条记录: ```java @Service public class MyService { @Autowired private SqlSession sqlSession; public void updateRecord() throws Exception { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); try (SqlSession session = sqlSession.openSession(true)) { // 自动回滚 RecordMapper mapper = session.getMapper(RecordMapper.class); Record record = mapper.findById(1); // 获取记录实例 if (record != null) { // 更新记录 record.setField(...); mapper.update(record); } } } } ``` 在这个例子中,我们使用了Spring AOP的事务管理,并通过手动设置事务状态为只滚动回滚(如果发生异常则回滚整个事务)。这种方式可以在一定程度上保证单个操作的原子性,但在分布式系统中可能需要额外的协调和考虑。 ### 相关问题: 1. 在MyBatis中如何实现乐观锁和悲观锁? 2. Spring Boot中如何配置MyBatis自动管理事务? 3. 分布式系统中如何有效解决多线程下的事物一致性问题?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值