破坏事务原子性、一致性的问题

本文讨论了在Controller层直接调用Service层多个DML操作可能导致的数据不安全性问题,阐述了Spring事务管理的传播机制和隔离级别,以及如何通过正确使用事务来确保数据的一致性和安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

复盘了一下上周写的代码,没注意的情况下在Controller中调用了Service的多个DML操作,这就是妥妥的数据不安全的操作。
我们在Service层配置的事务的隔离级别统一为DEFAULT,传播机制为REQUIRED,也就是说支持当前事务,如果当前没有事务,则开启新的事务。而由于Controller层并没有事务控制,在该层执行多个DML操作,如果其中有部分操作失败了,就会导致事务的原子性遭到了破坏。

多个增删改的操作应该置于一个事务中完成。

下面附上Spring事务管理的传播机制和隔离级别的说明:

传播属性说明
PROPAGATION_REQUIRED0支持当前事务,如果当前没有事务,则新建一个事务,这是Spring的默认属性
PROPAGATION_SUPPORTS1支持当前事务,如果当前没有事务,则以非事务方式运行
PROPAGATION_MANDATORY2支持当前事务,如果当前没有事务,则抛出异常
PROPAGATION_REQUIRES_NEW3新建事务,如果当前存在事务,则将当前事务挂起
PROPAGATION_NOT_SUPPORTED4以非事务方式运行,如果当前存在事务,则将当前事务挂起
PROPAGATION_NEVER5以非事务方式运行,如果当前存在事务,则抛出异常
PROPAGATION_NESTED6如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则以类似PROPAGATION_REQUIRED的形式运行
隔离级别说明
ISOLATION_DEFAULT-1这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别
ISOLATION_READ_UNCOMMITED1最低级别的事务隔离,允许一个事务看到另一个事务未提交的数据。可以产生脏读、幻读、不可重复读的问题。
ISOLATION_READ_COMMITED2保证事务的数据提交后才能被另一个事务读取到。
ISOLATION_REPEATABLE_READ3可以防止脏读、不可重复读,但不能避免幻读。
ISOLATION_SERIALIZABLE4最高级别,代价高昂。

关于脏读、幻读、不可重复读之类问题的概念:

  • 脏读:一个事务读到另一个事务未提交的更新数据。
  • 不可重复读:一个事务两次读同一行数据,可是这两次读到的数据不一样。
  • 幻读:一个事务执行两次查询,但第二次查询比第一次查询多出了一些数据行。
  • 丢失更新:撤消一个事务时,把其它事务已提交的更新的数据覆盖了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值