文章目录
spring事务管理
事务概念:
什么是事务?概念
- 事务就是用户定义的一系列执行SQL语句的操作, 这些操作要么完全地执行,要么完全地都不执行, 它是一个不可分割的工作执行单元。
1、事务的四大属性 /ACID
性质 | 描述 | |
---|---|---|
原子性(atomicity) | 事务是一个原子操作,由一系列动作组成.事务的原子性确保动作要么全部完成要么完全不起作用。 | 一个事务中的执行动作,只要一个未执行,那么全部动作都不执行 |
一致性(consistency) | 一旦所有事务动作完成,事务就被提交.数据和资源就处于一种满足业务规则的一致性状态中。 | 几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致。 |
隔离性(isolation) | 可能有许多事务会同时处理相同的数据,因此每个事物都应该与其他事务隔离开来,防止数据损坏。 | 事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。 |
持久性(durability) | 一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响.通常情况下,事务的结果被写到持久化存储器中。 | 事务一旦成功提交,那么该事务对数据的处理是不受影响的(系统崩溃,断电) 对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。 |
请描述事务的ACID属性
1.原子性:事务中的执行动作要么都执行,要么都不执行;
2.隔离性:多个事务对同一数据进行操作,每个事务的执行不会受到其他事务的干扰;
3.一致性:多个并行的事务执行的结果,必须和某一顺序执行的结果一致
4.持久性:对于任意提交的事务,系统必须保证事务对数据库的改变不会丢失,即使数据库出现故障
2、spring事务管理的7种事务传播行为/属性
REQUIRED | adj. 必需的,规定的;理想的 v. 需要;要求做(某事 | 如果有事务在运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行 |
---|---|---|
REQUIRED_NEW | 需要更新的 | 当前的方法必须启动新事务,并在它自己的事务内运行.如果有事务正在运行,应该将它挂起 |
SUPPORTS | 支持 | 如果有事务在运行,当前的方法就在这个事务内运行.否则它可以不运行在事务中. |
NOT_SUPPORTE | 不支持 | 当前的方法不应该运行在事务中,如果有运行的事务,将它挂起 |
MANDATORY | adj. 强制性的,义务的;受(前国际联盟)委任统治的 n. 受托人,代理人 | 当前的方法必须运行在事务内部,如果没有正在运行的事务,就抛出异常 |
NEVER | adv. 决不,永不;不会,不可能 | 当前的方法不应该运行在事务中.如果有运行的事务,就抛出异常 |
NESTED | adj. 嵌套的,内装的 v. 筑巢;嵌入 | 如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行;否则,就启动一个新的事务,并在它自己的事务内运行. |
请描述spring事务管理的7种事务传播行为
答:1.REQUIRED:如果有事务在运行就在该事务中运行,否则就开启一个事务运行
2.REQUIRED_NEW:当前的方法必须启动新的事务,并在自己的事务中运行;如果有事务在运行,就将它挂起
3.SUPPORTE :如果有事务在运行,则就在该事务内运行。否则可以并在事务中运行
4.NOT_SUPPORTE:当前的方法不运行在事务中,如果有事务则将它挂起
5.MANDTORY :当前的方法必须运行在事务中,如果没有正在运行的事务,就抛出异常
6.NEVER:当前的方法不应该运行在是事务中,如果有运行的事务,就抛出异常
7.NESTED:如果有事务在运行,则该方法开启一个事务并嵌套在该事务中运行;
否则:就开启一个新事务,并在自己的事务中运行
3、事务的隔离级别
隔离级别 | 释义 | 描述 |
---|---|---|
DEFAULT | 默认 | 使用底层数据库的默认隔离级别.对于大多数数据库来说,默认隔离级别都是READ_COMMITTED |
READ_UNCOMMITTED | 读未提交 | 允许事务读取未被其他事物提交的变更.脏读,不可重复读和幻读的问题都会出 |
READ_COMMITTED | 读已提交 | 只允许事务读取已经被其它事务提交的变更.可以避免脏读,但不可重复读和幻读问题仍然可能出现 |
REPEATABLE_READ | 可重复读取 | 确保事务可以多次从一个字段中读取相同的值.在这个事务持续期问,禁止其他事物对这个字段进行更新.可以避免脏读和不可重复读,但幻读的问题仍然存在. |
SERIALIZABLE | 可序列化的 | 确保事务可以从一个表中读取相同的行.在这个事务持续期问,禁止其他事务对该表执行插入,更新和删除操作.所有并发问题都可以避免,但性能十分低下. |
描述事务的隔离级别,以及分别能解决什么问题?
答:四种隔离级别
1.READ_UNCOMMITTED:读未提交,允许事务读取其他事务未提交的数据;数据库默认的隔离级别;
2.READ_COMMITED:读已提交,不允许事务读取其他事务未提交的数据;解决脏读
3.REPEATABLE_READ:可重复读取,确保事务多次从一个字段中读取出相同的值;解决脏读和不可重复读
4.SERIALIABLE:可序列化,确保事务可以从一个表中读取相同的行,在这个事务执行期间,会锁住改表,不允许其他事务对其进行更新,改变;解决幻读,同时解决脏读,不可重复读;注意效率比较低
4、并发事务导致的问题:脏读、不可重复读读、幻读
问题 | 描述 | 阐述 |
---|---|---|
脏读 | 对于两个事务T1,T2,T1读取了已经被T2更新但还没有被提交的字段.之后,若T2回滚,T1读取的内容就是临时且无效的. | 读到另一个事务的未提交更新数据,即读取到了脏数据; |
不可重复读 | 对于两个事务T1,T2,T1读取了一个字段,然后T2更新了该字段.之后,T1再次读取同一个字段,值就不同了. | 事务A对同一记录的两次读取,另一事务在这时间内对该记录做了修改;事务A两次读取数据不一致 |
幻读 | 对于两个事务T1,T2,T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行.之后,如果T1再次读取同一个表,就会多出几行 | 事务A对同一张表的两次查询不一致,另一事务B在这两次查询时间间隔内插入了记录; |
什么是脏读,不可重复读,幻读,数据库是怎么解决这些问题的?
答:
1.脏读:事务A读取到了事务B未提交的数据,然后事务B回滚了;事务A就读取的是临时的无效的数据;
2.不可重复读:事务A读取两次数据,在这之间事务B对数据进行了更新;导致事务A两次读取数据不一致
3.幻读:事务A读取两次数据,在这之间事务B对数据进行了插入;导致事务A两次读取数据的行数不一致
解决脏读:开启事务并设置隔离级别读已提交(READ_CMMITED)
解决不可重复读取:开启事务并设置隔离级别可重复读取(REPEATABlE_READ),同时解决脏读
解决幻读:开启事务并设置隔离级别可序列化(SERIZLIZABLE),同时解决脏读、不可从合肥读取
5、@Autowired 注入三种方式
答:3种:
1.属性注入,
@Autowired
private SysRole role;
2.构造方法注入
private SysRole role;
@Autowired
public void SysRoleServiceImpl(SysRole sysRole){
this.role=sysRole;
}
3.setter方法注入
private SysRole role;
@Autowired
public void setRole(SysRole role) {
this.role = role;
}