问:事务的隔离性和隔离级别有什么关系?
在jdbc中,事务只针对每一个connect连接,而不是说整个库,我可以针对每一个不同的jdbc连接设置不同的隔离级别。
事物的隔离性:是指事务彼此独立,都是独立的单元,互不影响,不会交叉。就像两个线程调用同一个方法,线程和线程是相互独立的。
而隔离级别是指对共享的表数据进行操作的时候上锁的方式不一样。这样就会对其他的事务对共享表数据的操作,造成一些间接影响。但是事务本身的代码是相互独立的。并不会出现一个事务中的代码,串到另一个事务之中。一个事务中是不能感知到另一个事务的存在。而所方案是对这两个事务双方都有影响的。在数据库中,两个事务,很有可能隔离级别不一样。随着事务隔离级别的升级,对数据库加锁的粒度越大,并发性能就越低。
在spring中我们对事务的理解仅限制在@Transcation这个注解中。几乎从来都没有配置过隔离级别,这是为什么呢,其实是使用了spring的事务的默认隔离级别。隔离级别其实包含了线程安全所机制。所以我们可以称之为:本质上来说就是数据库锁机制。原子性,隔离性(锁机制),持久性,保证了一件事 ,那就是我们存储在数据库中的数据都是一致的。
spring事务的传播行为
1、PROPERGATION_MANDATORY: 方法必须运行在一个事务中,不存在事务则抛出异常
2、PROPERGATION_NESTED: 存在事务则运行在嵌套事务中,不存在则创建一个事务
3、PROPERGATION_NEVER: 当前方法不能运行在事务中,存在事务则抛出异常
4、PROPERGATION_NOT_SUPPORT: 当前存在事务则将其 挂起
5、PROPERGATION_REQUIRED: spring默认的传播机制,能满足绝大部分业务需求,如果外层有事务,则当前事务加入到外层事务,一块提交,一块回滚。如果外层没有事务,新建一个事务执行,至少要保证在一个事务中运行。
6、PROPERGATION_REQUIRES_NEW: 该事务传播机制是每次都会新开启一个事务,同时把外层事务挂起,当当前事务执行完毕,恢复上层事务的执行。如果外层没有事务,执行当前新开启的事务即可
7、PROPERGATION_SUPPORT: 存在事务则加入,不存在也可以
这里有必要说明一下PROPERGATION_REQUIRES和PROPERGATION_REQUIRES_NEW的区别,
如果某个业务对象所做的事情不想影响到外层事务,PROPERGATION_REQUIRES_NEW是个合适的选择,比如,假设当前的业务方法需要向数据库中插入某些日志信息,但即使这些日志更新失败,我们也不想因为该业务方法的事务回滚而影响到外层事务的成功提交。因为这种情况下当前业务方法的事务成功提交与否对于外层都是无关紧要的。这里有必要用一张图来表示PROPERGATION_REQUIRES和PROPERGATION_REQUIRES_NEW涉及多个事务相互之间的地位。