自己学习然后搭建了一个Spring+SpringMVC+Mybatis的框架,然后实现事务
这里是事务的配置
<!-- 配置数据源 使用的是Druid数据源 -->
<bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<!-- 用来检测有效sql -->
<property name="validationQuery" value="${validationQuery}" />
......
</bean>
<!-- 配置事务管理 -->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 拦截器方式配置事物 -->
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 必须要有事务,没有则创建 -->
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<!-- 可以有可以没有 -->
<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
<tx:method name="select*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
<!-- Spring aop事务管理 -->
<aop:config>
<aop:pointcut id="transactionPointcut" expression="execution(* com.sanguo.service.impl..*Impl.*(..))" />
<aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice"/>
</aop:config>
如果不会配置的可以自己在网上找其他博客,里面有详细配置ssm项目的配置,在这里推荐一个
http://blog.csdn.net/gebitan505/article/details/44455235/
配置好之后写了个测试类去实验一下
public int insertList(List<User> userList) {
for (User user : userList) {
userMapper.insert(user);
}
return 1;
}
第一次运行插入list里面的user数据没有问题,因为这个没有异常,可以很好的运行下去,主键也自动增加了5个
之后我就想在程序运行出现异常看看能否完成插入,看看数据能不能回滚
public int insertList(List<User> userList){
for (User user : userList) {
userMapper.insert(user);
}
int s = 1 / 0;
return 1;
}
这次我写了一个“1/0”,这样运行就会出错,这样让程序出错看看能否增加成功
这次可以看见主键确实是增加了,但是数据确没有添加成功,说明事务确实是配置成功了
但是我听说事务成功需要把异常去抛出来,于是我试了一下把异常捕获,然后解决看一下
public int insertList(List<User> userList){
for (User user : userList) {
userMapper.insert(user);
}
int s = 0;
try {
s = 1 / 0;
} catch (Exception e) {
// 捕获了异常,并把异常信息打印
e.printStackTrace();
}
return 1;
}
在运行的时候把这个会出现异常的代码try-catch,然后去运行
看到,控制台确实有异常,并且也打印出了结果,把异常捕获之后,确实可以插入成功
然后我再尝试把异常给抛出去看看能够添加成功不,于是又改造了一下方法
public int insertList(List<User> userList) throws Exception{
for (User user : userList) {
userMapper.insert(user);
}
int s = 0;
try {
s = 1 / 0;
} catch (Exception e) {
e.printStackTrace();
throw e;// 抛出异常
}
return 1;
}
可以看到主键增加了,但是数据库数据并没有增加,说明事务确实成功
总结:
事务配置确实是有用的,但是在使用事务的时候,需要在某个service中去把异常抛出来,不能去try-catch的解决它,只有在service中抛出来然后又异常,事务才能够真正的起作用。