事务 原子性 一致性 隔离性 持久性
@Transactional
接口中不能用 public 的方法才起作用
!!!!!多线程下事务管理因为线程不属于 spring 托管,故线程不能够默认使用 spring 的事务,也不能获取spring 注入的 bean 。
多线程不属于spring 就没有了上下文 而且不能使用bean
在 Spring 的 AOP 代理下,只有目标方法由外部调用,目标方法才由 Spring 生成的代理对象来管理,这会造成自调用问题。若同一类中的其他没有@Transactional 注解的方法内部调用有@Transactional 注解的方法,有@Transactional 注解的方法的事务被忽略,不会发生回滚!!!!!!
@Transactional(readOnly = false, propagation = Propagation.REQUIRED ,
isolation = Isolation.REPEATABLE_READ,rollbackFor= Exception.class,
timeout = 30)事务的隔离级别!!!!
这个针对两个事务之间!!!!,不是事务就直接查的之前的数据!!!! 隔离级别针对本方法去读其他数据!!!!!!
事务级别会锁住操作的行,所有都成功了后才会提交!!!! 会存在cache里面
rollback commit
Transactional(isolation = Isolation.READ_UNCOMMITTED)读取未提交数据(会出现脏读,不可重复读) 基本不使用
@Transactional(isolation = Isolation.READ_COMMITTED):读取已提交数据(会出现不可重复读和幻读) 更新数据只会锁住相应的行!!!脏读 但是不能防止加数据幻读 默认!
@Transactional(isolation = Isolation.REPEATABLE_READ):可重复读(会出现幻读) 更新数据时会锁住整张表 !!!
@Transactional(isolation = Isolation.SERIALIZABLE):串行化
@Transactional(isolation = Isolation.default) 使用数据库默认的隔离级别
事务传播行为:如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为
1. TransactionDefinition.PROPAGATION_REQUIRED:
如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。
2. TransactionDefinition.PROPAGATION_REQUIRES_NEW:
创建一个新的事务,如果当前存在事务,则把当前事务挂起。
3. TransactionDefinition.PROPAGATION_SUPPORTS:
如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
4. TransactionDefinition.PROPAGATION_NOT_SUPPORTED:
以非事务方式运行,如果当前存在事务,则把当前事务挂起。
5. TransactionDefinition.PROPAGATION_NEVER:
以非事务方式运行,如果当前存在事务,则抛出异常。
6. TransactionDefinition.PROPAGATION_MANDATORY:
如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
7. TransactionDefinition.PROPAGATION_NESTED:
如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;
如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。
属性
value 指定事务管理器
readOnly 只读
timeout 事务超时 默认设置为底层事务系统的超时值
rollback-for 用于指定能够触发事务回滚的异常类型,如果有多个异常类型需要指定,各类型之间可以通过逗号分隔。
no-rollback- for 抛出 no-rollback-for 指定的异常类型,不回滚事务。
默认情况下,只有未检查异常(RuntimeException和Error类型的异常)会导致事务回滚。而在遇到检查型异常时不会回滚!!!!
error一定回滚 throwable是父类
exception分为运行异常和非运行异常
RuntimeException运行异常 空指针 对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止!!!!!
非运行异常r如IOException、SQLException等以及用户自定义的Exception异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch并处理,否则程序就不能编译通过
编程式事务:许用户在代码中精确定义事务的边界。编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。
工作单元执行的一系列操作,要么完全地执行,要么完全地不执行,这是一种机制,用以维护数据库的完整性。在你这个事务单元中存在两个操作,一个是update,一个是select;你前面的update执行成功了,再执行select肯定能够查询到前面update的数据,因为你是在一个单元中。但是另外一个事务(即另一个单元)则不能select到这个update的数据,因为你update的数据还没提交,只在该单元中有效!!! 单个单元里有效!!! 在同一事务中不存在隔离
@ApiOperation("修改设备")
@GetMapping("update1")
@Transactional(
isolation = Isolation.READ_COMMITTED,
timeout = 60)
public void update1(){
System.out.println(iSysDeviceService.getById(188).toString());
} @ApiOperation("修改设备")
@GetMapping("update")
@Transactional(
isolation = Isolation.READ_UNCOMMITTED,
timeout = 60)
public ResultObject update(SysDevice sysDevice,String area,String unit) throws InterruptedException {
ResultObject res = new ResultObject(); SysDevice sysDevicetest = new SysDevice();
BeanUtils.copyProperties(sysDevice,sysDevicetest);
sysDevicetest.setDeviceId(0);
iSysDeviceService.save(sysDevicetest);// String string = null;
// if(string.equals("")) {
// int i = 0;
// } boolean b = iSysDeviceService.updateById(sysDevice);
if (b) {
QueryWrapper<SysDeviceMonitorArea> areaQueryWrapper = new QueryWrapper<SysDeviceMonitorArea>();
areaQueryWrapper.lambda().eq(SysDeviceMonitorArea::getDeviceId,sysDevice.getDeviceId());
iSysDeviceMonitorAreaService.remove(areaQueryWrapper); Thread.sleep(1000*70);
QueryWrapper<SysDeviceMonitorUnit> unitQueryWrapper = new QueryWrapper<SysDeviceMonitorUnit>();
unitQueryWrapper.lambda().eq(SysDeviceMonitorUnit::getDeviceId,sysDevice.getDeviceId());
iSysDeviceMonitorUnitService.remove(unitQueryWrapper);
}
}
}
}
查出批量查出
insert into sys_risk(risk_type,risk_name,risk_des,risk_suggestion,risk_grade) select attack_type,rule_name,risk_analysis,handle_advice,risk_level from biz_handle_advice
insert into sys_risk(risk_type,risk_name,risk_des,risk_suggestion,risk_grade) select repository_type,repository_title,repository_des,repository_solution,repository_grade from sys_repository
















