SSM-如何验证事务是否生效
来源:互联网 发布:怎么用u盘安装ubuntu 编辑:程序博客网 时间:2024/05/22 01:34
spring配置事务的三种方式:编程式、声明式、注解式
1、配置事务
要实现注解式的事务配置,只需在applicationContext.xml中加入如下代码:
<!-- 配置事务管理器 --><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /></bean><tx:annotation-driven transaction-manager="txManager" />
只需在业务层中添加@Transaction方法即可使用事务
@Transaction
只能用到public方法上,对于其他非public方法,标记了@Transaction也不会报错,但方法没有事务功能<!-- mybatis.spring自动映射,会扫描org.mybatis.spring.sample.mapper下的所有接口,然后创建各自接口的动态代理类 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.mycompany.web.entity.mapping"/></bean><!-- 自动扫描,多个包以 逗号分隔,让Bean定义注解工作起来 --><context:component-scan base-package="com.mycompany.web"/><aop:aspectj-autoproxy proxy-target-class="true"/>如果此时报错,是因为文件头没有引入xmlns和schema导致的,在文件头引入即可,只需引入需要的
2、单个事务测试场景:
插入一个User对象的集合,如果插入对象的个数小于2,则正常插入;如果试图插入5条数据(对象的个数大于2),则抛出异常(事务必处理必须抛出异常,只有这样,spring才能帮助事务回滚),这样,数据库就会回滚,不插入任何数据。测试结果,如果数据库没插入任何数据,证明事务处理设置成功,否则,失败。测试业务类方法的代码如下:
@Service("userService")public class UserServiceImpl implements IUserService{@Resourceprivate IUserDao userDaoImpl;@Transactional@Overridepublicvoid Amethod(List<User> userList){for(int i=0;i<userList.size();i++){if(i<<span style="color:#ff0000;background-color: rgb(255, 255, 255);">2</span>){this.userDaoImpl.insert(userList.get(i));}else{thrownew RuntimeException();}}}}
由于单元测试没有成功,将测试代码放入Controller方法中,走页面跳转:
@RequestMapping("/index")public String getUserById(Model model){ List<User> userList = new ArrayList<User>(); for(int i=0;i<5;i++){ User userTemp = new User(); userTemp.setId(i+2L); userTemp.setAge(i); userTemp.setName("xiaohong" + i); userTemp.setGender("女"); userList.add(userTemp); } userService.insertUser(userList); return "MyJsp"; }运行成功后打开访问页面,会出现错误,因为方法中抛出了这个异常。实质上是进行了事务管理,数据库没有插入数据,表示事务配置成功;反之,如果方法上去掉@Transaction,则前两条数据会插入到数据库中,然后报异常。
参考出处忘记了。
3、多个事务测试场景:
场景一:在2的基础上再加一个实体UserRole,同样的方式测试业务类中加入方法:
@Transactional@Overridepublic void Bmethod(List<UserRole> userRoleList){<span style="white-space:pre"></span>for(int i=0;i<userRoleList.size();i++){<span style="white-space:pre"></span>if(i<<span style="color:#ff0000;">2</span>){<span style="white-space:pre"></span>this.userRoleDaoImpl.insertSelective(userRoleList.get(i));}else{<span style="white-space:pre"></span>throw new RuntimeException();}}}在Controller类的方法getUserById中加入如下代码:
List<UserRole> userRoleList = new ArrayList<UserRole>(); for(int i=0;i<5;i++){ UserRole userRoleTemp = new UserRole(); userRoleTemp.setRoleId(i+1L); userRoleTemp.setUserId(i+1L); userRoleTemp.setCreateUserId(i+1L); userRoleTemp.setCreateTime(new Date()); userRoleList.add(userRoleTemp); } userRoleService.insertUserRole(userRoleList);运行后,发现两个事务是单独生效并且都生效的
场景二:那么再修改一下,在Amethod中调用Bmethod方法,在controller中调用A方法,问:此时生效的事务是A还是B还是A和B的事务都生效?
结果:
1)当A、B都满足条件时(即条件为插入数据小于2条,而试图插入的数据个数也小于2条),才成功保存数据并且全部数据都成功保存;
2)当A不满足条件或B不满足条件或A和B都不满足条件时,全部回滚,所有数据都保存失败,并抛出异常。
0 0
- SSM-如何验证事务是否生效
- 如何验证Tomcat配置的Gzip是否生效的方法
- 验证mx记录是否生效
- 如何查看域名解析是否生效?
- 如何查看MX记录是否已经生效?
- 如何查看MX记录是否已经生效?
- SSM事务
- 如何使用命令方式检测mx记录是否生效
- 如何知道mysql中sql语句索引是否生效
- 如何查看域名/DNS/MX/解析是否生效
- 如何知道mysql中sql语句索引是否生效
- 如何知道mysql中sql语句索引是否生效
- SpringMVC+myBatis事务不生效
- @Transactional事务注解没有生效
- spring事务注解不生效
- spring事务,内部调用生效
- 如何检查cnd加速是否生效?如何检测cdn加速效果?
- Javascript如何验证是否是数字
- Material Design Theme
- Simple Game
- 单链表的创建/测长/打印
- mysql系列3-mysql主从同步
- mybaits之动态sql
- SSM-如何验证事务是否生效
- 初探react-native Hello World
- 阿里云服务器Web项目配置发布全过程(一)
- Link/Cut Tree
- 安卓开发 画一条竖线
- Android AIDL demo
- poj 3190 Stall Reservations(贪心)
- 给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度。C实现
- Vitaly and Strings