事务的特征–
1.原子性
事务是数据库的逻辑工作单位,事务中包括的所有操作,要么全做,要么全部做
2.一致性
事务执行的结果必须是使数据库从一个一致性状态飙到另一个一致性状态,一致性与原子性是密切相关
3.隔离性
一个事务的执行不能被其他事务干扰,既是事务与事务之间是互不干扰的
4.持续性/永久性
一个事务一旦提交,他对数据库的改变就应该是永久性的
1.开始干活,首先新建一个数据表Account
2.用自动生成包和代码的那个模板帮我们生成Account表对应的mapper文件
3.创建AccountDao,在里面编写这个数据增减的操作,首先查询主键为对应数字的对象命名为xq/bz,然后进行数值加减数值加减完以后放回bz对象里面,然后再更新到数据库。利用subtract()进行减,add()进行增加
然后再创建一个text类来测试
然后发现Junit运行出错,第一个错误是我的AccountMapper.xml文件里面没有修改好第二个错误是
也就是找不到我的Dao
分析一波,首先测试类中是通过spring-mybatis.xml容器来找到我们的dao,所以我们要在前面那个AccountDao.java中加上注解,让容器获得我们的Dao,在类上加上注解@Component
在属性上添加注解@Autowired
4.最后查看数据库,数据发生了变化证明成功了
5.把事务管理的内容都加到spring-mybatis.xml文件中去
<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx --><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="delete*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" /><tx:method name="insert*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" /><tx:method name="update*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" /><tx:method name="batch*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" /></tx:attributes></tx:advice><aop:aspectj-autoproxy proxy-target-class="true" /><!-- 事务处理 --><aop:config><aop:pointcut id="pc" expression="execution(* com.chair.test.service..*(..))" /><aop:advisor pointcut-ref="pc" advice-ref="txAdvice" /></aop:config>
如果有报错的话那么就在xml文件下面的那个
也就是在哪个包里面生效
我们以后编写的业务逻辑的代码都放到service层里面
6.创建service层的包,创建service类
7.将dao层的包名改为service.impl,且将里面的dao类名都改为service,然后实现service接口
编写测试类
给AccountService接口添加上zhuangzhang这个方法
修改spring-mybatis.xml中改为Service层的包名
在上面没有zhuanzhang这个方法,所以事务不生效,解决方法有两种
1)在上面配多一个zhuanzhang的方法提交到事务
2)第二种就是将方法名改为上面所拥有的那些方法名作为前缀