知识放时间久了,有空总想回顾起来,有时候喜欢手写,有时候喜欢边打字边理解,哈哈~
数据库提供了四种事务隔离级别:
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 注解,而不要用在类所要实现的任何接口上,