spring @Transactional注解用于事务回滚案例

这里基于小编的这篇博文的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保存就相当于有多个事务,这些事务在遇到下面的异常时,就会全部回滚,从而保证了事务的原子性。

猜你喜欢

转载自blog.csdn.net/csdnliuxin123524/article/details/81237592