1、什么是事务?
事务就是把一系列的动作当成一个独立的工作单元(Isolation),这些动作要么全部完成,要么全部不起作用(Consistency)。就是把一系列的操作不可分割(Atomicity)。并且完成事务操作之后数据库会永久保存操作。(Durability)
2、数据库常见事务并发执行出现的三大问题(同一事务下才会出现问题)
2.1、读脏数据
当A事务和B事务并发进行时,A操作修改一条数据,B读取数据,然后A进行回滚操作,此时B去读取的数据就是无效数据。这就是脏读。
2.2、不可重复读
当A事务和B事务并发进行时,A读取一条数据,B进行修改并提交,A再进行读取这条数据时出现了在同一个事务下读取同一条数据出现不一样的值。
2.3、幻读
当A事务和B事务并发进行时,A读取一条数据(假设大于price大于1000的数据是5条),然后此时B新增了一批数据,其中也有2条price大于1000的数据,A就会读出7条。
等级: 幻读 > 不可重复读 > 读脏数据
@Transactional("下列参数可选项")
3、事务常用的隔离级别isolation
3.1、读未提交
事务A读取到了事务B未提交的数据,既不能解决读脏数据,也不能解决不可重复读,更不能解决幻读。
3.2、读已提交
事务A读取到的数据只能是B提交后的数据,解决了读脏数据,但是不能解决不可重复读和幻读。
3.3、可重复读
事务A开始读取数据时不允许事务B修改数据。解决了前两个,幻读不可解决。但是在mysql当中可以解决以上三个现象,Mysql默认事务隔离级别就是可重复读
4、Spring声明式事务常见以及常用的传播行为propagation-Propagation
4.1、SUPPORTS:支持运行在事务中,没有事务也可以不运行在事务中
4.2、NOT_SUPPORTED:当前方法不应该运行在事务中,如果有运行的事务将它挂起;
4.3、MANDATORY:当前方法必须在事务事务中运行,如果没有事务,抛出异常;
4.4、NEVER:与MANDATORY相反,不应该运行在事务中,有事务,就抛出异常;
4.5、NESTED:如果有事务,就在当前事务中嵌套运行。没有就重启一个事务,在自己的事务中运行
5、noRollbackFor-Class[]:哪些异常事务可以不回滚;
6、noRollbackForClassName-String:同上但要写全类名java.lang.String
7、rollbackFor-Class[]:指定哪些异常事务需要回滚;
8、rollbackForClassName-String[]:同上但要写全类名java.lang.String
异常分类:
编译时异常(非检查异常):要么使用try、catch,要么在方法上声明throws;默认不回滚
运行时异常:可以不用处理,默认全都回滚
9、readOnly-boolean:设置事务为只读事务
可以进行事务优化;
readOnly=true:加快查询速度,不用管事务的一堆操作。
10、timeout-int(秒为单位):超时:事务超出指定时长后自动终止并回滚