spring @Transaction事务不生效问题

标签: spring transaction 问题 | 发表时间:2019-07-02 16:18 | 作者:mygodccl
出处:https://www.iteye.com
如果你已经排除了以下问题:
https://blog.csdn.net/qq_20597727/article/details/84900994

或是数据库本身不支持, 如MySQL的Myisam.

不防看看是不是由多数据源引起的:

多数据源我们一般这样配置:
@Configuration
    @EnableDataSource("A")
    @EnableJpaRepositories(
        repositoryFactoryBeanClass = CustomRepositoryFactoryBean.class,
        entityManagerFactoryRef = "defaultEntityManagerFactory",
        basePackages = {"com.A.dao"},
        transactionManagerRef = "defaultTransactionManager"
    )
    @ConditionalOnProperty(
        prefix = "XXX.datasource.default",
        name = {"driverClassName", "url", "username", "password"}
    )
    protected static class DataSourceDefaultConfiguration {
        private static final Logger log = LoggerFactory.getLogger(DataSourceConfiguration.DataSourceDefaultConfiguration.class);

        protected DataSourceDefaultConfiguration() {
        }
    }

@Configuration
    @EnableDataSource("B")
    @EnableJpaRepositories(
        repositoryFactoryBeanClass = CustomRepositoryFactoryBean.class,
        entityManagerFactoryRef = "myGblEntityManagerFactory",
        basePackages = {"com.B.dao"},
        transactionManagerRef = "myGblTransactionManager"
    )
    @ConditionalOnProperty(
        prefix = "XXX.datasource.myGbl",
        name = {"driverClassName", "url", "username", "password"}
    )
    protected static class DataSourceMyGblConfiguration {
        private static final Logger log = LoggerFactory.getLogger(DataSourceConfiguration.DataSourceMyGblConfiguration.class);

        protected DataSourceMyGblConfiguration() {
        }
    }


这样, 其中一个数据源就是默认的数据源, 如A. 如果使用@Transaction注解开启事务, 默认使用默认数据源A来进行开启, 提交, 回滚 事务, 这个时候如果@Transaction方法里面是对com.B.dao进行的操作, 那么其实事务也是作用在A数据源上, 就会产生事务不生效的假象.
这时需指定事务对象来声明事务: @Transactional(value = "myGblTransactionManager"), 这时事务会作用在com.B.dao的操作上.

关于事务是否生效, 可以从这里入手检查:
org.springframework.orm.jpa.JpaTransactionManager

@Override
	protected void doBegin(Object transaction, TransactionDefinition definition) {
		JpaTransactionObject txObject = (JpaTransactionObject) transaction;

		if (txObject.hasConnectionHolder() && !txObject.getConnectionHolder().isSynchronizedWithTransaction()) {
			throw new IllegalTransactionStateException(
					"Pre-bound JDBC Connection found! JpaTransactionManager does not support " +
					"running within DataSourceTransactionManager if told to manage the DataSource itself. " +
					"It is recommended to use a single JpaTransactionManager for all transactions " +
					"on a single DataSource, no matter whether JPA or JDBC access.");
		}

		try {
			if (!txObject.hasEntityManagerHolder() ||
					txObject.getEntityManagerHolder().isSynchronizedWithTransaction()) {

如果是非JpaTransactionManager, 可以从其接口入手PlatformTransactionManager

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [spring transaction 问题] 推荐:

spring @Transaction事务不生效问题

- - Java - 编程语言 - ITeye博客
如果你已经排除了以下问题:. 或是数据库本身不支持, 如MySQL的Myisam. 不防看看是不是由多数据源引起的:. 多数据源我们一般这样配置:. 这样, 其中一个数据源就是默认的数据源, 如A. 如果使用@Transaction注解开启事务, 默认使用默认数据源A来进行开启, 提交, 回滚 事务, 这个时候如果@Transaction方法里面是对com.B.dao进行的操作, 那么其实事务也是作用在A数据源上, 就会产生事务不生效的假象.

MySQL 事务RUNNING状态引发的Transaction timed out: deadline问题

- - CSDN博客推荐文章
    朋友说简单的查询导致Transaction timed out: deadline问题,怀疑是数据库表锁了,. 1,应用故障描述Deadline问题: . 2,检查Innodb存储引擎状态以及表锁状态.         SHOW ENINGE INNODB STATUS;没有死锁信息以及其它异常信息;去查询系统表INNODB_LOCKS、INNODB_LOCK_WAITS表都为NULL,只有INNODB_TRX表有记录,并且处于长时间RUNNING状态,判断是因为事务没有提交或者回滚的缘故.

Spring MVC 3.2.4 ResponseBody 编码问题解决

- - 编程语言 - ITeye博客
首先请确保Spring版本为3.2.4. 问题1:使用@ResponseBody注解,返回对象类型时,如Map,中文字符,在客户端会显示为???. 解决办法:请检查依赖jar包,确保spring-context-support.jar的版本也是3.2.4,则可显示中文;. 问题2:使用@ResponseBody注解,返回String时,中文字符,在客户端会显示为???,并且contextType中会缺失encoding值,即为text/html但是,没有后面的encode.

spring声明事务失效问题

- - 编程语言 - ITeye博客
     在项目开发中遇到了一个spring事务失效的问题,检查配置文档,都没有问题,其他的类中的方法都能进行事务管理,而这个类中的方法却不行. [size=large]分析[/s[color=darkblue]ize][/color].      查看代码发现三个问题:. 原因1、在方法内抓了异常,但是没有往外抛.

Spring 初始化2次的问题

- - 企业架构 - ITeye博客
在Spring的使用中,有时初始化一些公共类,比如数据源、常量配置等,这些方法会执行两次,导致程序执行出现异常. 一个解决方法是利用Spring的事件机制,事件机制需要实现ApplicationListener监听器,只要编写一个实现类实现该接口的onApplicationEvent方法,在方法体中初始化应用需要的初始化数据,并做防二次初始化的处理.

Spring并发访问的线程安全性问题

- - 寒江孤影
和Struts一样,Spring的Controller默认是Singleton的,这意味着每个request过来,系统都会用原有的instance去处理,这样导致了两个结果:一是我们不用每次创建Controller,二是减少了对象创建和垃圾收集的时间;由于只有一个Controller的instance,当多个线程调用它的时候,它里面的instance变量就不是线程安全的了,会发生窜数据的问题.

spring mvc使用Servlet3异步要注意的几个问题

- - 企业架构 - ITeye博客
1、注意添加 true. 在web.xml中对DispatcherServlet添加true. 2、如果集成了shiro一定要注意在mapping中增加dispatcher项,否则会抛出org.apache.shiro.UnavailableSecurityManagerException异常.

前后端分离,spring boot跨域问题

- - 编程语言 - ITeye博客
1995年,同源政策由 Netscape 公司引入浏览器. 目前,所有浏览器都实行这个政策. 最初,它的含义是指,A网页设置的 Cookie,B网页不能打开,除非这两个网页"同源". 所谓"同源"指的是"三个相同". 协议相同/域名相同/端口相同. 一句话:浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域.

项目中单元测试容易出现的普遍问题归纳(Junit/Spring/Spring-test/Dubbo/RocketMQ/JAVA)

- - 编程语言 - ITeye博客
   最近公司要求项目在使用maven构建的时候不能跳过test的生命周期,也就是通过mvn test命令需要将整个项目运行起来. 因为之前项目组的成员都是在eclipse中去执行的unit test,在maven对所有模块构建的都是直接-Dmaven.test.skip=true的方式直接跳过UT的.

Transaction中SQL的顺序引起的死锁

- - BlogJava-首页技术区
因为项目的数据更新频率很高,导致经常出现死锁的问题. 感觉以下遇到的一种情况比较典型,也比较tricky,计之. 如以下两条非常简单的SQL语句,它们共同组成了一个Transaction,那么在多线程高频率执行时就会引起死锁问题(当然这里要考虑锁的级别问题,一般多类似这种系统都会选择行锁,那么以下引起死锁的条件是两条语句都对同一行操作): select  from  where  = ? .