spring是如何管理事务的
事务的四大特性
事务的处理AOP
首先事务从哪层开启的?为什么是service层而不是mapper层?
Service开启的。
因为业务逻辑写在service层,它得保证事务得四大特性,调用多个方法得时候使用一个事务,所以写在service层,如果写在mapper层,没有办法做到多个方法用一个事务,并且是通过spring来管理数据库得事务的
事务问的比较多:四大特性(ACID)
原子性:
概念型理解:事务是不可分割的一部分,要么同时执行成功,要么集体回滚,比如一个方法中管理了多个方法,如果其中有一个执行失败,集体回滚。
业务型理解:我有一百块钱,给你转五十,转账过程中出现问题,不会扣除我的钱,你的钱也不会增加。
一致性:
概念型理解:是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
业务型理解:我有一百块钱,给你转五十,我还剩五十,咱们两个相加还是一百。
隔离性:
概念型理解:事务之间是相互隔离,互相不受打扰。
业务型理解:我给你转账的过程中,是不允许立马执行查询的,必须等待转账成功后,再执行查询的操作。
排它锁、行级锁、表级锁
持久性:
概念型理解:事务一旦提交,不再执行修改事务的情况下,它就是永久性的保存的。
业务型理解:服务器宕机了,电脑坏掉了,数据还有吗?一定是有的,因为它持久化了。
代码上的理解:在AOP里定义事务处理,根据传播特性定义。或是用注解@transcational
我在一个方法里同时执行添加和修改或同时执行多个操作的时候,
代码里不允许报错否则全部回滚
xml代码里是如何配置AOP的
1. 首先通过IOC的bean标签创建出一个事务的管理器transcationmanager,定义advice的通知,把增删改以外的方法都定义成只读的,只有增删改的方法有事务,这样的目的是为了让查询更快。然后再通过切面表达式,把事务控制在service层。
切面表达式是如何配置
2.具体的细节记不太清楚,但是表达式的写法应该是,定义包名和通配符
Com.lizx.service. *. *(…)
只读的(read-only)是如何配置
3.在advice里,指定好查询方法后,在方法里写一个属性是read-only=”true”或(false)