数据库-事务¶
我们可以这么认为:start transaction;(或者begin;)之后就给系统打了一个快照.接下来我们可以不断操作,如果需要(如遇见了错误),就可以rollback;返回到快照的状态.如果觉得操作完成了,就可以把这些操作commit提交.
我们在datagrip的控制台输入一些语句.在commit之前,如果我们通过图形化查看数据库,会发现数据库里并没有我们刚才修改的数据.通过命令查看,则有.说明这些只能在当前窗口查看.这就是隔离性的体现.
spring中的事务¶
加到类上,则类所有的方法都会开启事务.加到接口上,也是如此.
推荐加到方法上.
如果一个方法当中只操作了一次数据库,那么不需要添加@Transactional
只有多次增删改操作时,才添加事务.
可以单独设置包的日志等级:

特定类型异常回滚¶
Transactional只在出现运行时异常RuntimeException时才会回滚.
这样可以:
这样所有异常都能回滚了.
传播行为¶
所谓默认,就是如果方法是被其他方法调用的,会把被调用方法的事务添加到原本的事务.否则,就创建一个新的事务.
前两个最常用
样例¶
这样是有问题的.因为,如果try中抛出异常,那么虽然会执行finally,但是执行完后,方法体执行完,事务会回滚.从而,导致日志的插入也被回滚了.
这是因为日志的插入也被当前事务所管理了.当前事务回滚,会导致日志的插入也会回滚.因此要单独给它加一个事务.
这也不可行.因为默认会加入到当前事务.因此就需要如此:
这样执行时,会挂起当前事务,执行新的事务:
新事务完成后,会恢复之前挂起的事务:

四大特性(ACID)¶
后续可见文件上传-JavaWeb