in" applicationContext-base.xml"我在下面添加:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
>
.....
<!-- transaction support-->
<!-- PlatformTransactionMnager -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- enable transaction annotation support -->
<tx:annotation-driven transaction-manager="txManager" />
我想为&#34;控制器&#34;中的某个功能设置一个事务。
@Controller
@RequestMapping("/ywdata")
public class YwController extends BaseController{
....
@Transactional(timeout=1)
private void submitNewSXSQ(Map map, HttpServletRequest request, HttpServletResponse response) throws Exception {
...//STEP1 :do some db insert and update STEP1
if(true)
throw new Exception("test transaction ");
...//STEP2: do another db insert and update
我期望db操作永远不应该提交,因为我在返回之前抛出异常。但实际上不是。
答案 0 :(得分:8)
您的代码存在多个问题:
@Transactional
不起作用@Transactional
在@Controller
注释的课程上通常不起作用最后一个问题很容易理解。让我解释前两个问题。 Spring中的AOP就是这样的:
为什么私有方法有问题:
@Transactional
(代理上只有接口方法),则@Transactional
将无效。@@Transactional
(在动态子类中只能覆盖非私有和非最终方法),@Transactional
将无效。为什么控制器有问题:
RequestMappingHandlerMapping
(负责将请求映射到您的@Controllers
的bean)要求应用程序上下文获取带有@Controller
注释的所有bean
怎么做:
OpenSessionInViewFilter
获取灵感。TransactionTemplate
帮助程序类。答案 1 :(得分:1)
从Spring文档中,它是默认行为:事务被标记为仅针对未经检查的异常进行回滚。
参见doc
的第10.5.3节