使用Spring的jdbc事务管理器手写一个编程事务

事务

1、事务分类:编程事务和声明式事务。
2、事务的作用是为了保证数据的一致性。
3、事务的特性(ACID):原子性、一致性、隔离性、持久性

使用Spring的JdbcTemplate和Jdbc事务管理器写一个编程事务

1、配置好beans.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
    	 http://www.springframework.org/schema/beans/spring-beans.xsd
     	 http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd
         http://www.springframework.org/schema/aop
         http://www.springframework.org/schema/aop/spring-aop.xsd
         http://www.springframework.org/schema/tx
     	 http://www.springframework.org/schema/tx/spring-tx.xsd">
     	 
	<!-- 扫描dao和service的包 -->     	 
    <context:component-scan base-package="com.zyyx.dao,com.zyyx.service,com.zyyx.util"/>
    <!-- 配置数据源 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
		<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mybatis"></property>
		<property name="user" value="root"></property>
		<property name="password" value="wangliuyi520YL"></property>
	</bean>
    <!-- 管理jdbcTemplate的bean -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    	<property name="dataSource" ref="dataSource"/>
    </bean>
    <!-- 配置jdbc事务管理器 -->
     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
</beans>

2、封装一个事务管理的工具类

/**
 * 事务工具类
 * @author 紫炎易霄
 */
@Component
public class TxManagerUtil {
	//注入jdbc事务管理器
	@Autowired
	private DataSourceTransactionManager dataSourceTransactionManager;
	/**
	 * 开启事务
	 */
	public TransactionStatus begin(){
		 return dataSourceTransactionManager.getTransaction(new DefaultTransactionDefinition());	
	}
	/**
	 * 提交事务
	 */
	public void commit(TransactionStatus transactionStatus){
		dataSourceTransactionManager.commit(transactionStatus);
	}
	/**
	 * 回滚事务
	 */
	public void rollback(TransactionStatus transactionStatus){
		dataSourceTransactionManager.rollback(transactionStatus);
	}
}

3、配置好dao和service

@Repository
public class UserDao {
	//使用jdbcTemplate
	@Autowired
	private JdbcTemplate jdbcTemplate;
	
	public void save(String name,Integer age){
		String sql = "insert into users(name,age) values(?,?)";
		jdbcTemplate.update(sql,name,age);
	}
}
@Service
public class UserService {
	
	@Autowired
	private UserDao userDao;
	
	@Autowired
	private TxManagerUtil txManagerUtil;//注入事务管理的工具类
	
	public void save(String name,Integer age){
		//开启事务
		TransactionStatus status = txManagerUtil.begin();
		try {
			userDao.save(name, age);
			System.out.println("执行完毕!");
			//提交事务
			txManagerUtil.commit(status);
		} catch (Exception e) {
			e.printStackTrace();
			//回滚事务
			txManagerUtil.rollback(status);
		}
	}
}

4、测试
一、测试之前的数据库
使用Spring的jdbc事务管理器手写一个编程事务
二、测试代码

public class TestJdbcTemplate {
	public static void main(String[] args) {
		ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
		UserService userService = (UserService) ac.getBean("userService");
		userService.save("你是我女朋友", 20);
	}
}

测试结果
使用Spring的jdbc事务管理器手写一个编程事务
现在我们抛出一个异常

@Service
public class UserService {
	
	@Autowired
	private UserDao userDao;
	
	@Autowired
	private TxManagerUtil txManagerUtil;//注入事务管理的工具类
	
	public void save(String name,Integer age){
		String nulls = null;
		//开启事务
		TransactionStatus status = txManagerUtil.begin();
		try {
			userDao.save(name, age);
			nulls.length();//指针异常
			System.out.println("执行完毕!");
			//提交事务
			txManagerUtil.commit(status);
		} catch (Exception e) {
			e.printStackTrace();
			//回滚事务
			txManagerUtil.rollback(status);
		}
	}
}

运行结果
使用Spring的jdbc事务管理器手写一个编程事务