Skip to content

数据库-事务

48c06a9468df28a4735cb6ef4948ab02_MD5 0a4f7793f36ad81c7977e78a32ad9f7d_MD5 我们可以这么认为:start transaction;(或者begin;)之后就给系统打了一个快照.接下来我们可以不断操作,如果需要(如遇见了错误),就可以rollback;返回到快照的状态.如果觉得操作完成了,就可以把这些操作commit提交.

我们在datagrip的控制台输入一些语句.在commit之前,如果我们通过图形化查看数据库,会发现数据库里并没有我们刚才修改的数据.通过命令查看,则有.说明这些只能在当前窗口查看.这就是隔离性的体现.

spring中的事务

da17ba053141f129cf0e878aca33bc1a_MD5 加到类上,则类所有的方法都会开启事务.加到接口上,也是如此. 推荐加到方法上. 如果一个方法当中只操作了一次数据库,那么不需要添加@Transactional 只有多次增删改操作时,才添加事务. 可以单独设置包的日志等级: c0e57c56a79a810843062cf8e1dab351_MD5

特定类型异常回滚

529cdef49af6796c5166ebc91e569fc4_MD5 Transactional只在出现运行时异常RuntimeException时才会回滚. 这样可以: 874dbc3fc7fc721de4070a5a2f9d91e7_MD5 这样所有异常都能回滚了.

传播行为

2338e16fa55521b37362ade227d038ff_MD5 9f089fa4707f6cbec252a819228f870f_MD5 a08b6745908175a8c22e2dbfd1cdcc12_MD5 所谓默认,就是如果方法是被其他方法调用的,会把被调用方法的事务添加到原本的事务.否则,就创建一个新的事务. 前两个最常用

样例

023f610d13106d683023891578dfbd56_MD5 这样是有问题的.因为,如果try中抛出异常,那么虽然会执行finally,但是执行完后,方法体执行完,事务会回滚.从而,导致日志的插入也被回滚了. 这是因为日志的插入也被当前事务所管理了.当前事务回滚,会导致日志的插入也会回滚.因此要单独给它加一个事务. d387f1e28028d522e3714526c1ee70c8_MD5 这也不可行.因为默认会加入到当前事务.因此就需要如此: 23cef9ee89584a6cfeac826011488e22_MD5 这样执行时,会挂起当前事务,执行新的事务: bffb19f01ae24316453bd1d77ba4f22d_MD5 新事务完成后,会恢复之前挂起的事务: e8a9ac8ed9a080d0acd202f641ac32e1_MD5

四大特性(ACID)

54cc9585dc9cc296d015e2a05ec1c0a9_MD5 后续可见文件上传-JavaWeb