使用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、测试
一、测试之前的数据库
二、测试代码
public class TestJdbcTemplate {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = (UserService) ac.getBean("userService");
userService.save("你是我女朋友", 20);
}
}
测试结果
现在我们抛出一个异常
@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);
}
}
}
运行结果