Java Spring声明性事务未工作(事务未提交)
Spring声明性事务不工作(未提交) 弹簧配置 服务豆 刀豆 结果与问题 在部署并发送请求“/test/tx.html”后,事务将毫无问题地执行,但数据库记录不会持久化。 我想,事务没有提交。 有什么问题吗 日志Java Spring声明性事务未工作(事务未提交),java,spring,transactions,Java,Spring,Transactions,Spring声明性事务不工作(未提交) 弹簧配置 服务豆 刀豆 结果与问题 在部署并发送请求“/test/tx.html”后,事务将毫无问题地执行,但数据库记录不会持久化。 我想,事务没有提交。 有什么问题吗 日志 DEBUG>11:02:10-名为“spring dispatcher”的DispatcherServlet处理[/test/tx.html]的请求☜ java:781 调试>11:02:10-调用请求处理程序方法:public org.springframework.web.ser
DEBUG>11:02:10-名为“spring dispatcher”的DispatcherServlet处理[/test/tx.html]的请求☜ java:781
调试>11:02:10-调用请求处理程序方法:public org.springframework.web.servlet.ModelAndView com.store.web.front.controller.TestTxControllerImpl.transaction()☜ java:134
信息>11:02:10-#TestTxController.transaction()-com.store.web.front.service。TestTxServiceImpl@126cb1a ☜ TestTxControllerImpl.java:23
INFO>11:02:10-#TestTxService.transaction()☜ TestTxServiceImpl.java:25
INFO>11:02:10-#TestDao.insertTest()☜ java:20
调试>11:02:10-打开SqlMapSession[com.ibatis.sqlmap.engine.impl。SqlMapSessionImpl@1bc345a]iBATIS手术☜ SqlMapClientTemplate.java:177
调试>11:02:10-从数据源获取JDBC连接☜ java:112
调试>11:02:10-已获得iBATIS操作的JDBC连接[JDBC:oracle:thin:@localhost:1521:XE,UserName=STORE,oracle JDBC驱动程序]☜ SqlMapClientTemplate.java:194
调试>11:02:10-将JDBC连接返回到数据源☜ java:312
信息>11:02:10-#已成功插入!!!-测试[id=111,name=First]☜ TestTxServiceImpl.java:33
我找到了这个问题的原因。
DispatcherServlet加载事务声明文件时,
事务控制成功。
但是该文件是由ContextLoaderListener加载的,事务控制不好。
我不知道为什么会出现这种差异。
你能给我解释一下吗?bean由BeanPostProcessor
s(在你的例子中可能是由AspectJawareAdvisor或AutoProxyCreator
用“AOP素材”修饰)。这些后处理器bean是特定于上下文实例的
如果在servlet上下文中配置AOP,并且在根上下文中有目标bean(反之亦然),那么这就是为什么不应用切入点
通常的做法是在根上下文中使用较低级别的bean(服务和DAO)和AOP配置,在servlet上下文中只保留UI bean(MVC内容)TestTxServiceImpl类的完全限定名是什么?使用STS,并检查建议的标记是否显示在您的服务方法旁边。如果未显示,则可能您的建议配置不正确。完全限定的类名为“com.store.web.front.service.TestTxServiceImpl”。您能告诉我如何使用STS进行检查吗?嗨,拉尔夫!你能更准确地给我解释一下吗。例如,什么菜单和如何使用。。。
<!-- DATASOURCE -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
<property name="initialSize" value="${dbcp.initialSize}"/>
<property name="maxActive" value="${dbcp.maxActive}"/>
<property name="maxIdle" value="${dbcp.maxIdle}"/>
<property name="maxWait" value="${dbcp.maxWait}"/>
<property name="poolPreparedStatements" value="${dbcp.poolPreparedStatements}"/>
<property name="validationQuery" value="select 1 from dual"/>
<property name="testOnBorrow" value="${dbcp.testOnBorrow}"/>
<property name="maxOpenPreparedStatements" value="${dbcp.maxOpenPreparedStatements}"/>
<property name="logAbandoned" value="${dbcp.logAbandoned}"/>
<property name="removeAbandoned" value="${dbcp.removeAbandoned}"/>
<property name="removeAbandonedTimeout" value="${dbcp.removeAbandonedTimeout}"/>
**<property name="defaultAutoCommit" value="false"/>**
</bean>
<!-- IBATIS -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocations" value="classpath:/config/ibatis/sqlMapConfig.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
<property name="sqlMapClient" ref="sqlMapClient"/>
</bean>
<!-- TRANSACTION -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" isolation="READ_COMMITTED" timeout="10" read-only="false"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="serviceMethods" expression="execution(public * com.store.web.front.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods"/>
</aop:config>
package com.store.web.front.controller;
public interface TestTxControllerIF {
public ModelAndView transaction();
}
package com.store.web.front.controller;
@Controller
public class TestTxControllerImpl implements TestTxControllerIF {
@Autowired
protected TestTxServiceIF testService;
Logger logger = Logger.getLogger(TestTxControllerIF.class);
@Override
@RequestMapping(value = "/test/tx.html")
public ModelAndView transaction() {
logger.info("# TestTxController.transaction() - " + testService);
testService.transaction();
return new ModelAndView("main");
}
}
package com.store.web.front.service;
public interface TestTxServiceIF {
public void transaction();
}
package com.store.web.front.service;
@Service
public class TestTxServiceImpl implements TestTxServiceIF {
Logger logger = Logger.getLogger(TestTxServiceImpl.class);
@Autowired
protected TestDaoIF testDao;
@Override
public void transaction() {
logger.info("# TestTxService.transaction()");
Test test1 = new Test("111", "First");
Test test2 = new Test("222", "Second");
Test test3 = new Test("333", "Third");
testDao.insertTest(test1);
logger.info("# Successfully inserted!!! - " + test1);
testDao.insertTest(test2);
testDao.insertTest(test3);
}
}
package com.store.web.front.dao;
public interface TestDaoIF {
public void insertTest(Test test);
}
package com.store.web.front.dao;
@Repository
public class TestDaoImpl extends AbstractIBatisDao implements TestDaoIF {
Logger logger = Logger.getLogger(TestTxServiceImpl.class);
@Override
public void insertTest(Test test) {
logger.info("# TestDao.insertTest()");
template.insert("test.insertTest", test);
}
}