深入理解Spring事务
一.什么是事务,为什么要有事务?
简括:
数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。
作用:
保证数据的一致性。
特性:
原子性:不可分割;
一致性:数据一致;
隔离性:互不影响;
持久性:永久保存数据。
二.项目中是怎样用事务的?
分类:
1.编程事务:手动开启关闭事务;
2.声明式事务:自动开启关闭事务。
xml方式和注解方式。
编程事务代码如下:
xml配置:
@Component
public class TransactionManager {
@Autowired
private DataSourceTransactionManager dataSourceTransactionManager;
public TransactionStatus begin() {
// 获取到事物状态
return dataSourceTransactionManager.getTransaction(new DefaultTransactionAttribute());
}
// 提交事务
public void commit(TransactionStatus transactionStatus) {
dataSourceTransactionManager.commit(transactionStatus); // 数据会提交到数据库中...
}
// 回滚事务
public void rollback(TransactionStatus transactionStatus) {
dataSourceTransactionManager.rollback(transactionStatus);
}
}
service:
public void add() {
TransactionStatus transactionStatus=transactionManager.begin();
try {
System.out.println("业务逻辑层");
userDao.add("狒狒1",21);
// int i=1/0;
userDao.add("莫吊",21);
transactionManager.commit(transactionStatus);
}catch (Exception e){
e.printStackTrace();
if (transactionStatus!=null) {
transactionManager.rollback(transactionStatus);
}
}
}
}
dao:
public void add(String name, int age) {
/**
* @description:使用工具类操作数据库
* @param name,age
* @return: void
* @author: LiShun
* @time: 2019/12/10 14:23
*/
String sql = "INSERT INTO user(name,age) values(?,?);";
int update = jdbcTemplate.update(sql, name, age);
System.out.println("updateResult:" + update);
}
测试类:
如果不将int i=1/0注释,会回滚事务,数据不会添加至数据库。反之,添加成功。
注解方式实现:
修改xml:
修改service:
运行后会抛异常回滚事务,数据不会添加成功。需要将int i=1/0注释,才会添加数据成功。
三.传播七种行为。
Spring中事务的定义:
Propagation(key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。)有以下选项可供使用:
- PROPAGATION_REQUIRED--支持当前事务,如果当前方法没有事务,就新建一个事务。这是最常见的选择。
- PROPAGATION_SUPPORTS--支持当前事务,如果当前方法没有事务,就以非事务方式执行。
- PROPAGATION_MANDATORY--支持当前事务,如果当前方法没有事务,就抛出异常。
- PROPAGATION_REQUIRES_NEW--新建事务,如果当前方法存在事务,把当前事务挂起。
- PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前方法存在事务,就把当前事务挂起。
- PROPAGATION_NEVER--以非事务方式执行,如果当前方法存在事务,则抛出异常。