关于spring事务控制无效的问题

MisterNil 2017-02-17 02:37:00
新接触这方面的知识,写的时候遇到了一个问题,模拟更改用户状态,其中一个事务是1.user1的状态由1减为0,2.user2的状态由0增加为1. 中间我用一个int i=1/0 来模拟异常。结果总是user1的更新成功,user2的失败,按原意是如果user2失败,user1也回滚的。请朋友看看,是不是spring配置文件中的事务管理器写错了?,谢谢。各种配置以及代码如下

1.数据库表初始截图

2.spring配置
<!-- 配置sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:com/bsss/conf/mybatis.xml"></property>
</bean>

<bean id="userDAO" class="com.bsss.dao.impl.UserDAOImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>

<!-- 声明式事务配置 -->
<!-- 配置事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置事务通知 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<!-- 配置哪些方法使用什么样的事务,配置事务的传播特性 -->
<tx:method name="update*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 配置AOP -->
<aop:config>
<aop:pointcut expression="execution(* com.bsss.services.UserServices+.*(..))" id="pointcut"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
</aop:config>
<!-- 声明式事务结束 -->

3.mybatis以及usermapper.xml配置
<!-- mybatis.xml配置 -->
<configuration>
<mappers>
<!-- 实体类映射文件 -->
<mapper resource="com/bsss/entity/UserMapper.xml"/>
</mappers>
</configuration>

<!-- usermapper.xml配置 -->
<mapper namespace="com.bsss.entity.UserMapper">
<resultMap type="com.bsss.entity.User" id="UserResult">
<id column="id" jdbcType="INTEGER" property="id"/>
<result column="name" jdbcType="VARCHAR" property="name"/>
<result column="state" jdbcType="INTEGER" property="state"/>
</resultMap>
<select id="updateUser">
update test set state=#{state} where id=#{id}
</select>
</mapper>

4.Services接口和实现类
public interface UserServices {
public void updateUser(User user1, User user2);
}

public class UserServicesImpl implements UserServices {

private ApplicationContext ac;

@Override
public void updateUser(User user1, User user2) {
ac = new ClassPathXmlApplicationContext("com/bsss/conf/beans.xml");
UserDAO uld = (UserDAO)ac.getBean("userDAO");
uld.updateUser(user1);
int i = 1 / 0;
uld.updateUser(user2);
}
}

5. DAO接口及实现类
public interface UserDAO {
public int updateUser(User user);
}

public class UserDAOImpl extends SqlSessionDaoSupport implements UserDAO{
@Override
public int updateUser(User user) {
return getSqlSession().update("com.bsss.entity.UserMapper.updateUser", user);
}
}

6.User实体类,由于太占篇幅,就不贴出setter/getter方法了
private int id;
private String name;
private int state;

7.测试类
public class Test {
public static void main(String[] args) {
User user1 = new User();
user1.setId(1);
user1.setState(0);

User user2 = new User();
user2.setId(2);
user2.setState(1);

UserServices uls = new UserServicesImpl();
uls.updateUser(user1, user2);
}
}


执行结果总是user1的state编程了1,按理说应该是user2失败,user1也回滚的
...全文
128 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
MisterNil 2017-02-17
  • 打赏
  • 举报
回复
引用 3 楼 qnmdcsdn 的回复:
我知道了,你的UserServices 是手动new出来的,不是由spring托管的,所以事务配置不起作用
终于好了,确实你说的这个问题。太感谢了
MisterNil 2017-02-17
  • 打赏
  • 举报
回复
引用 3 楼 qnmdcsdn 的回复:
我知道了,你的UserServices 是手动new出来的,不是由spring托管的,所以事务配置不起作用
我在spring配置文件中增加了
<bean id="userServices" class="com.bsss.services.impl.UserServicesImpl"></bean>
测试类改成了
ApplicationContext ac = new ClassPathXmlApplicationContext("com/bsss/conf/beans.xml");
		UserServices uls = (UserServices)ac.getBean("userServices");
结果还是那样,user1依然更新了。 是不是我上面的代码写的有错误? 谢谢
MisterNil 2017-02-17
  • 打赏
  • 举报
回复
忘记不能编辑帖子了。。很是郁闷啊
  • 打赏
  • 举报
回复
我知道了,你的UserServices 是手动new出来的,不是由spring托管的,所以事务配置不起作用
MisterNil 2017-02-17
  • 打赏
  • 举报
回复
引用 1 楼 qnmdcsdn 的回复:
事务里边没配回滚机制吧,另外切面那里是不是多了个+号
这个我是看imooc上老师的例子改了下,+号-老师解释的是包括services的子类 也不是说回滚,我把user1和2的操作放在一个事务里了,应该是中间由于1/0发生异常,直接不执行user1的更新才对。 我再编辑下帖子
  • 打赏
  • 举报
回复
事务里边没配回滚机制吧,另外切面那里是不是多了个+号

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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