事物:
是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;
这些操作作为一个整体一起向系统提交,要么都执行,要么都不执行,事物时一组不可再分割的操作集合(工作逻辑单元)
Transactional
没有开启事物之前,运行代码,如果代码中出现异常,异常前进行的数据库操作会保存到
数据库中,异常后进行的数据库操作不会保存到数据库中
Propagation属性:
REQUIRED:
使用当前的事务,如果当前没有事务,则自己新建一个事务,子方法是必须运行在一个事务中的;
如果当前存在事务,则加入这个事务,成为一个整体。
// 父类service方法
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void testPropagationTrans() {
stuService.saveParent();
stuService.saveChildren();
}
// 子类service方法
public void saveParent() {
Stu stu = new Stu();
stu.setName("parent");
stu.setAge(19);
stuMapper.insert(stu);
}
public void saveChildren() {
saveChild1();
int a = 1 / 0;
saveChild2();
}
// 父类方法中添加 事物注解,子类方法中出现异常整体都会回滚
// 父类service方法
@Override
public void testPropagationTrans() {
stuService.saveParent();
stuService.saveChildren();
}
// 子类service方法
public void saveParent() {
Stu stu = new Stu();
stu.setName("parent");
stu.setAge(19);
stuMapper.insert(stu);
}
@Transactional(propagation = Propagation.REQUIRED)
public void saveChildren() {
saveChild1();
int a = 1 / 0;
saveChild2();
}
// 子类方法添加事物注解,当前子类方法回滚,父类方法没有事物注解代码不会回滚
// 父类service方法
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void testPropagationTrans() {
stuService.saveParent();
stuService.saveChildren();
}
// 子类service方法
public void saveParent() {
Stu stu = new Stu();
stu.setName("parent");
stu.setAge(19);
stuMapper.insert(stu);
}
@Transactional(propagation = Propagation.REQUIRED)
public void saveChildren() {
saveChild1();
int a = 1 / 0;
saveChild2();
}
// 父类方法添加事物注解,当前父类方法回滚,子类方法也有事物注解同样回滚
SUPPORTS:
如果当前有事务,则使用事务;如果当前没有事务,则不使用事务。
主要使用查询
// 父类service方法
@Override
public void testPropagationTrans() {
stuService.saveParent();
stuService.saveChildren();
}
// 子类service方法
public void saveParent() {
Stu stu = new Stu();
stu.setName("parent");
stu.setAge(19);
stuMapper.insert(stu);
}
@Transactional(propagation = Propagation.SUPPORTS)
public void saveChildren() {
saveChild1();
int a = 1 / 0;
saveChild2();
}
// 父类方法无事物,父类方法不回滚,子类方式使用SUPPORTS,异常前方法不回滚
// 父类service方法
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void testPropagationTrans() {
stuService.saveParent();
stuService.saveChildren();
}
// 子类service方法
public void saveParent() {
Stu stu = new Stu();
stu.setName("parent");
stu.setAge(19);
stuMapper.insert(stu);
}
@Transactional(propagation = Propagation.SUPPORTS)
public void saveChildren() {
saveChild1();
int a = 1 / 0;
saveChild2();
}
// 父类方法使用REQUIRED,父类方法回滚,子类方式使用SUPPORTS,方法回滚
MANDATORY:
该传播属性强制必须存在一个事务,如果不存在,则抛出异常
@Override
public void testPropagationTrans() {
stuService.saveParent();
stuService.saveChildren();
}
// 子类service方法
public void saveParent() {
Stu stu = new Stu();
stu.setName("parent");
stu.setAge(19);
stuMapper.insert(stu);
}
@Transactional(propagation = Propagation.MANDATORY)
public void saveChildren() {
saveChild1();
int a = 1 / 0;
saveChild2();
}
// 父类方法无事物,子类方式使用MANDATORY,直接抛出无事物异常
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void testPropagationTrans() {
stuService.saveParent();
stuService.saveChildren();
}
// 子类service方法
public void saveParent() {
Stu stu = new Stu();
stu.setName("parent");
stu.setAge(19);
stuMapper.insert(stu);
}
@Transactional(propagation = Propagation.MANDATORY)
public void saveChildren() {
saveChild1();
int a = 1 / 0;
saveChild2();
}
// 父类方法有事物,子类方式使用MANDATORY,直接抛出无事物异常
REQUIRES_NEW:
如果当前有事务,则挂起该事务,并且自己创建一个新的事务给自己使用;
如果当前没有事务,则同 REQUIRED
@Override
public void testPropagationTrans() {
stuService.saveParent();
stuService.saveChildren();
}
// 子类service方法
public void saveParent() {
Stu stu = new Stu();
stu.setName("parent");
stu.setAge(19);
stuMapper.insert(stu);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void saveChildren() {
saveChild1();
int a = 1 / 0;
saveChild2();
}
// 父类方法无事物,子类方式使用REQUIRES_NEW,saveParent()保存到数据库 saveChildren() 回滚
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void testPropagationTrans() {
stuService.saveParent();
stuService.saveChildren();
}
// 子类service方法
public void saveParent() {
Stu stu = new Stu();
stu.setName("parent");
stu.setAge(19);
stuMapper.insert(stu);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void saveChildren() {
saveChild1();
int a = 1 / 0;
saveChild2();
}
// 父类方法有自己事物,子类方式使用REQUIRES_NEW新建事物,两个事物saveParent()回滚 saveChildren() 回滚
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void testPropagationTrans() {
stuService.saveParent();
stuService.saveChildren();
int a = 1 / 0;
}
// 子类service方法
public void saveParent() {
Stu stu = new Stu();
stu.setName("parent");
stu.setAge(19);
stuMapper.insert(stu);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void saveChildren() {
saveChild1();
saveChild2();
}
// 父类方法有自己事物,子类方式使用REQUIRES_NEW新建事物,两个事物saveParent()回滚 saveChildren()保存到数据库
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void testPropagationTrans() {
stuService.saveParent();
stuService.saveChildren();
int a = 1 / 0;
}
// 子类service方法
public void saveParent() {
Stu stu = new Stu();
stu.setName("parent");
stu.setAge(19);
stuMapper.insert(stu);
}
@Transactional(propagation = Propagation.REQUIRED)
public void saveChildren() {
saveChild1();
saveChild2();
}
// 父类方法有自己事物,子类方式使用REQUIRES 公用一个事物 saveParent()回滚 saveChildren()回滚 都不能保存到数据库
NOT_SUPPORTED:
如果当前有事务,则把事务挂起,自己不使用事务去运行数据库操作
@Override
public void testPropagationTrans() {
stuService.saveParent();
stuService.saveChildren();
}
// 子类service方法
public void saveParent() {
Stu stu = new Stu();
stu.setName("parent");
stu.setAge(19);
stuMapper.insert(stu);
}
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void saveChildren() {
saveChild1();
int a = 1 / 0;
saveChild2();
}
// 父类方法无事物,子类方式使用NOT_SUPPORTED 相当于无事物 saveParent()不回滚 saveChild1()不回滚异常前保存到数据库
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void testPropagationTrans() {
stuService.saveParent();
stuService.saveChildren();
}
// 子类service方法
public void saveParent() {
Stu stu = new Stu();
stu.setName("parent");
stu.setAge(19);
stuMapper.insert(stu);
}
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void saveChildren() {
saveChild1();
int a = 1 / 0;
saveChild2();
}
// 父类方法有事物,子类方式使用NOT_SUPPORTED 相当于无事物 saveParent()回滚 saveChild1()不回滚,saveChild1()保存到数据库
NEVER:
如果当前有事务存在,则抛出异常
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void testPropagationTrans() {
stuService.saveParent();
stuService.saveChildren();
}
// 子类service方法
public void saveParent() {
Stu stu = new Stu();
stu.setName("parent");
stu.setAge(19);
stuMapper.insert(stu);
}
@Transactional(propagation = Propagation.NEVER)
public void saveChildren() {
saveChild1();
int a = 1 / 0;
saveChild2();
}
// 父类方法有事物,子类方式使用NEVER 报发现事物异常,不允许使用事物,不会保存到数据库
@Override
public void testPropagationTrans() {
stuService.saveParent();
stuService.saveChildren();
}
// 子类service方法
public void saveParent() {
Stu stu = new Stu();
stu.setName("parent");
stu.setAge(19);
stuMapper.insert(stu);
}
@Transactional(propagation = Propagation.NEVER)
public void saveChildren() {
saveChild1();
int a = 1 / 0;
saveChild2();
}
// 父类方法无事物,子类方式使用NEVER 报除数为0异常,异常前代码数据保存到数据库,无回滚
NESTED:
如果当前有事务,则开启子事务(嵌套事务),嵌套事务是独立提交或者回滚;
如果当前没有事务,则同 REQUIRED。
但是如果主事务提交,则会携带子事务一起提交。
如果主事务回滚,则子事务会一起回滚。相反,子事务异常,则父事务可以回滚或不回滚。
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void testPropagationTrans() {
stuService.saveParent();
stuService.saveChildren();
int a = 1 / 0;
}
// 子类service方法
public void saveParent() {
Stu stu = new Stu();
stu.setName("parent");
stu.setAge(19);
stuMapper.insert(stu);
}
@Transactional(propagation = Propagation.NESTED)
public void saveChildren() {
saveChild1();
saveChild2();
}
// 父类方法有事物,子类方式使用NESTED ,报除数为0异常,事物回滚,数据没保存到数据库
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void testPropagationTrans() {
stuService.saveParent();
try {
// save point
stuService.saveChildren();
} catch (Exception e) {
e.printStackTrace();
}
}
public void saveParent() {
Stu stu = new Stu();
stu.setName("parent");
stu.setAge(19);
stuMapper.insert(stu);
}
@Transactional(propagation = Propagation.NESTED)
public void saveChildren() {
saveChild1();
int a = 1 / 0;
saveChild2();
}
// 父类方法有事物,子类方式使用NESTED ,父方法catch住异常,子事物回滚,父事物可以不回滚