spring 中事务不起作用

2021-01-03 21:14:59 +08:00
 fogsky

在学习 spring 事务。看完文档写了个 demo,发现事务没起作用。 具体问题是这样: 1 、 @Transactional ServiceA method 1 插入数据,@Transactional ServiceB method 2 中只抛出空指针异 常,结果发现数据库中 method1 插入数据提交了。 2 、method 1 中加入抛出空指针代码,并单独在 controller 中调用,则在数据库中未发现新数据插入。 框架使用的 spring boot+mybatis 。 代码 Controller:

@RequestMapping("/transaction")

public String transactionTest() {
	
	  Book book=new Book(); 
	  book.setName("发"); 
	  book.setAuthor("fage");
	  book.setPrice(102); 
	  bookService.saveOrUpdate(book);
	  serviceForTest.transactionTest(); 
	return "home";
}

ServiceA:

@Transactional(propagation=Propagation.REQUIRED)

public int saveOrUpdate(Book b) {

	int i;
	// TODO Auto-generated method stub
	if(b.getId()==null) {

		i=bookMapper.insertBook(b);

// String a = null; // a.indexOf('c'); return i;

        }

	return bookMapper.updateById(b);
	
}

ServiceB:

@Transactional(propagation=Propagation.REQUIRED)

public void transactionTest() {

	// TODO Auto-generated method stub
		String a = null;
        a.indexOf('c');

}
1119 次点击
所在节点    问与答
7 条回复
340244120w
2021-01-03 21:23:54 +08:00
不是没生效,只是没用对 。把 controller 的调用的多个方法 封装成一个事务就好了。
fogsky
2021-01-03 21:33:46 +08:00
@340244120w 封装成一个事务指的是?我只配置了一个 datasource,自动配置应该也是只配置了一个事务管理器。
micean
2021-01-03 21:48:01 +08:00
建议先玩 jdbc 的事务,再回头看 spring 的事务
340244120w
2021-01-03 22:29:30 +08:00
@fogsky 简单的说 一个注解默认对应一个单独的事务。而只有处在同一事务下的方法,才能统一回滚。而你的写法是两个事务了。
至于前面说的默认,可以看下 spring 事务传播。
fogsky
2021-01-03 23:26:44 +08:00
@340244120w 以为 propagation 设置为 required method2 就会加入 method 1 的事务。非常感谢解答。
w292614191
2021-01-04 09:11:27 +08:00
这是两个独立的事务了,如果你在 A 中调 B,B 异常了 A 回滚。
如果你在 Controller 调 A,B,她们并没有关系。
fogsky
2021-01-04 21:51:00 +08:00
@w292614191 恩,懂了,需要方法外部有事务存在。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/741286

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX