2019-2-20 笔记-数据库事务隔离级别与spring事务管理

知识放时间久了,有空总想回顾起来,有时候喜欢手写,有时候喜欢边打字边理解,哈哈~

数据库提供了四种事务隔离级别:

read uncommitted 会出现脏读,不可重复读,幻读;

read commited (sqlServer 、oracle默认隔离级别)可以避免脏读,但会出现不可重复读,幻读;读操作需要加S锁,但是在语句执行完以后释放S锁;

Repeatable read (Mysql默认)避免出现脏读和不可重复读,但会出现幻读;读操作需要加S锁,但是在事务提交之前并不释放S锁,也就是必须等待事务执行完毕以后才释放S锁。

Serializable 序列化,最高的事务隔离级别,同时代价高,性能低,一般很少使用,事务顺序执行,避免脏读,幻读和不可重复读;

数据库事务的四个要素:

原子性:事务是最小的工作单元,里面的操作要么都成功,要么都不成功。

一致性;

隔离性:并发事务之间不会影响。

持久性:事务一旦执行成功,便持久保存到数据库中了。

spring 声明式事务:

@Transactional注解中propagation 来设置事务传播行为; 

常用参数说明REQUIRED:如果当前存在事务,就加入当前事务,如果没,新建一个事务;

REQUIRED_NEW:不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕后 再继续执行旧的事务;

SUPPORTS:如果其他bean调用了这个方法,在其他bean中声明了事务,就用事务,如果那个bean中没有声明,则不用事务;

在@Transactional注解中isolation来设置数据库的隔离级别;

Isolation.READ_COMMITTED、REPEATABLE_READ(设置后,会覆盖数据库设置的隔离级别,即以spring设置的为准);

readOnly属性用于设置当前事务是否为只读事务,不允许修改和写入;默认为False 可读写;

rollbackFor:用于设置进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,该事务回滚;

注意:@Transactional只能被应用到public方法上,对于其他非public的方法,如果使用了该注解,不会报错,但不会生效,没作用;

spring团队建议,在具体的类或方法上使用@Transactional 注解,而不要用在类所要实现的任何接口上,

 

 

 

 

你可能感兴趣的:(数据库)