关于事务作用在service或者controller的解释
最近看到有同学将@Transactional 写在dao层的方法上,这就相当于白写了,为什么这么说呢?首先我们先讲一下事务的四大特性。
事务特性 | 解释 |
---|---|
原子性(Atomicity) | 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,如果操作失败则不能对数据库有任何影响。 |
一致性(Consistency | 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。 |
隔离性(Isolation) | 隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离 |
持久性(Durability) | 持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。 |
那么回到刚刚的问题
为什么说@Transactional 写在‘dao层的方法上就等于白写了呢?
当我们处理一个业务逻辑的时候,需要调用多个dao去完成,而当其中一个失败之后,之前的操作都需要回滚。如果事务开在了dao层,这就相当于一个dao一个事务,说白了就是跟没开一样。而我们想要完成的是当一个dao失败后,其他dao能够进行全部回滚的操作,所以我们需要把事务开在service层中。
由于业务的不同,其实也有同学开在了controller层,这也是没错的,总体来说看需求吧。