1、对比事务加在service层与dao层

    结合事务的四大特性(ACID),即可很好的解释为什么加在service层。首先,如果事务注解@Transactional加在dao层,那么只要与数据库做增删改,就需要提交一次事务;如此做事务的特性就发挥不出来,特别是事务的一致性,当出现并发问题时,从数据库查到的数据都有可能存在所偏差。 

    一般情况下,service层调用多个dao层的方法,只需要在service层的方法之上,加一个事务注解@Transactional即可;如此,使用一个事务处理多个数据库的请求,事务的特性也会充分的发挥出来。


2、各层加事务的区别

Spring事务为业务逻辑进行事务管理,保证业务逻辑上数据的原子性。

事务得根据项目性质来细分:事务可以设置到三个层面(dao层、service层和web层)。 

第一:controller层事务

安全性要求较高的系统来说的。例如电子商务网站。粒度小,一般系统用不着这么细。 

第二:service层事务

粒度较小,一般推荐这种方式。

第三:dao层数据务

粒度大。

   给Service层配置事务,因为一个Service层方法操作可以关联到多个DAO的操作。在Service层执行这些Dao操作,多DAO操作有失败全部回滚,成功则全部提交。

    事务分为业务事务和系统事务,业务事务也就是业务逻辑上操作的一致性,系统事务自然就是指真正的数据库事务,

    Spring配置事务的是为了什么进行管理,当然是为业务逻辑进行事务管理,保证业务逻辑上数据的原子性;

    Dao层是什么,数据访问层,是不应该包含业务逻辑的,这就是和Service层的不同;

    Service层就是业务逻辑层,事务的管理就是为Service层上的保证。