大家好,又见面了,我是你们的朋友全栈君。
这里基于小编的这篇博文的spring配置和实体类,service类为基础,解释@Transactional注解:
https://blog.csdn.net/csdnliuxin123524/article/details/80935836;
注意这里@Transcational注解起作用的前提是要使用spring的声明式事务:
<!-- 配置声明式事务 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
上面的配置在之前的博文中有配置过。
package redisCache.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import redisCache.entity.User;
import redisCache.mapper.UserMapper;
import redisCache.service.UserService;
/**
* Created by jiangfeixiang on 2018/4/27
*/
@Service("userService")
@Transactional
public class UserServiceImpl implements UserService {
//注入userMapper
@Autowired
private UserMapper userMapper;
/**
* 添加用户
*/
@Override
public void insertUser(User user){
userMapper.insertUser(user);
System.out.println("-------------");
String string = null;
if(string.equals("")) {
int i = 0;
}
}
}
上面的代码我们在类上加上了transactional注解,方法中有一个插入的数据的方法,然后是故意做一个异常,让事务回滚。
测试类:
package redisCache;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import redisCache.entity.User;
import redisCache.service.UserService;
public class TestTransactional {
public static void main(String[] args) {
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService=(UserService) applicationContext.getBean("userService");
User u=new User();
u.setId(1);
u.setUsername("xiaoming");
userService.insertUser(u);
}
}
然后运行测试类,最好debug运行,当走完service方法的插入到数据库操作时,你到数据库看,会发现数据库并没有插入数据。继续往下走就会抛出异常,数据库始终没有数据,保存也就没有成功。如果把service注解去掉,就会看到及时报异常,数据库也保存成功了。
在实际工作中我们更多的是遇到有多个关联的表都需要保存,很明显,为了保证事务的原子性,这些保存要么全部成功,要么全部失败。此时我就想到与要报这些保存都放在一个service方法中,如下:
public void insertUser(User user){
userMapper.insertUser(user);
User user2=new User();
user2.setId(2);
user2.setUsername("xiaohua");
userMapper.insertUser(user2);
User user3=new User();
user3.setId(2);
user3.setUsername("xiaohua");
userMapper.insertUser(user3);
System.out.println("-------------");
String string = null;
if(string.equals("")) {
int i = 0;
}
}
上面的user,user2,user3保存就相当于有多个事务,这些事务在遇到下面的异常时,就会全部回滚,从而保证了事务的原子性。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/106062.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...