【求助】springmvc事务处理的疑惑

为国读书 2014-06-29 12:25:54
springmvc.xml主要部分:

<mvc:annotation-driven />

<context:annotation-config/>

<context:component-scan base-package="com.sino.action" />
<context:component-scan base-package="com.sino.dao" />

<mvc:resources mapping="/img/**" location="/resource/images/" />
<mvc:resources mapping="/js/**" location="/resource/javascript/" />
<mvc:resources mapping="/css/**" location="/resource/css/" />


<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix"><value>/resource/</value></property>
<property name="suffix"><value>.jsp</value></property>
</bean>


spring-beans.xml主要部分:

<!-- 数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
<property name="targetDataSource">
<ref local="mainDataSource"/>
</property>
</bean>

<!-- 数据库 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>

<!-- 根据Annotation来生成事务代理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

<bean id="testDao" class="com.ppxueche.dao.TestDao">
<property name="dataSource" ref="dataSource" />
</bean>


web.xml部分:

<servlet>
<servlet-name>dispatch</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/config/springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatch</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- spring bean配置 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/config/spring-beans.xml</param-value>
</context-param>

下面是测试类们:
IBaseDao.java

public interface IBaseDao {
public void insert();
}

TestDao.java

public class TestDao extends JdbcDaoSupport implements IBaseDao {

private static Logger logger = Logger.getLogger(TestDao.class);

@Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true) //此处如果注释掉依旧依旧可以插入数据,为什么呢?
public void insert(){
int i = getJdbcTemplate().update("insert into test(test_name,test_content) values('test_title','test_content2')");
logger.info(i);
}
}

TestAction.java

@Controller
@RequestMapping("/test")
public class TestAction {


@RequestMapping("/list")
@ResponseBody
public void queryTestByProperty(HttpServletRequest request){
IBaseDao dao = (IBaseDao)ApplicationContextManagement.getApplicationContext().getBean("testDao");
dao.insert();
}
}

打印结果:

TestDao.insert(TestDao.java:20) - 1


在TestDao的测试方法中如果把@Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)这句去掉,依旧可以插入数据;
楼主有两个疑问:
1、在注释掉这条语句之后依旧可以插入数据,那么spring的事务是怎样管理的,因为已经没有通过spring-beans.xml文件中的代理了,也没有编程式的事务啊,疑惑疑惑;
2、如果没有注释掉,更加疑惑了,明明是propagation = Propagation.NOT_SUPPORTED了,为什么还能打开事务并进行管理??
...全文
307 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
loveunittesting 2014-06-30
  • 打赏
  • 举报
回复
引用 2 楼 poterban 的回复:
[quote=引用 1 楼 yys79 的回复:] 也别疑惑了,spring的事务控制不能用,bug严重。 另外有点晕,springmvc目前成了spring的代名词吗?springmvc还管什么数据库事务?好多人这么提问,也许我是在落伍了。
我只是用到springmvc这块而已了,至于事务管理,应该是可以的。[/quote] 以前一直用spring,大概半年多年前发现有数据源死锁的问题,解决了2个月都无果,多方调查发现是spring的bug,而且spring基本上不认帐,连提问这个问题的帖子都删了,还是别用了。
为国读书 2014-06-30
  • 打赏
  • 举报
回复
引用 1 楼 yys79 的回复:
也别疑惑了,spring的事务控制不能用,bug严重。 另外有点晕,springmvc目前成了spring的代名词吗?springmvc还管什么数据库事务?好多人这么提问,也许我是在落伍了。
我只是用到springmvc这块而已了,至于事务管理,应该是可以的。
loveunittesting 2014-06-29
  • 打赏
  • 举报
回复
也别疑惑了,spring的事务控制不能用,bug严重。 另外有点晕,springmvc目前成了spring的代名词吗?springmvc还管什么数据库事务?好多人这么提问,也许我是在落伍了。

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧