事务:原子性(不可分割),隔离性,一致性,持久性
上面四个词就告诉我们事务是什么。围绕事务的特质产生了一下问题
事务的传播机制,事务的隔离级别,以及事务的实现机制
1.事务的传播机制网上是说七种,就我对传播机制的认识,传播机制的产生是由于事务互相嵌套,而产生的不同情况下的不同选择方式。
第一种:默认,当前存在事务,使用当前事务,不存在则自己创建(最乖)
第二种:当前存在事务,使用当前事务,不存在则不使用(最随便)
第三种:使用当前事务,不存在则报错(最刻薄)
第四种:新建事务,如果存在当前事务,当前事务挂起(最独立)
第五种: 非事务运行,如果存在当前事务,当前事务挂起(最执着)
第六种:非事务运行,如果当前存在事务,则报错(最老实)
第七种:如果当前存在事务,则在嵌套事务中运行,如果不存在则和第一种一致。(最灵活)3.0以上才有
以上其中涵盖了。嵌套方式 3种使用当前事务,3种不使用当前事务,最后一种比较特殊,真正的子事务。
2.第二个问题是事务之间的隔离级别,一共四种,问题的产生是事务并行产生的,意思就是多个线程,同时执行事务而造成数据的不同程度错误。实际问题如下,根据深度从小到大排序,脏读,不可重复读,幻读。不可重复读和幻读的最大区别是,不可重复读是修改造成的,而幻读是增加造成的。因为造成的原因不同所以为了解决相应的问题,需要牺牲更大的成本。在mysql的默认级别 可重复读 ,这种级别并没有解决幻读。原因如以上提到的,代价不同,解决不可重复读,锁行锁就可以,而幻读需要锁住整张表。效率变的非常低下。
有次带来的一个问题。在事务内如果涉及到相关整表数据的合计判断等操作,要考虑到本操作由于数据库级别的原因,而产生幻读的现象。
3。第三的问题便是这锁的机理,java代码中有lock和Synchronize(悲观锁),数据库锁有二种乐观和悲观。各有个的优势,其中很多东西网上都用,这里不做述说。悲观可以避免脏读而乐观效率更高。
以上问题对事物从,并行发生(隔离级别),串行发生(传播机理),事物核心原理锁的说明。
学习是一种思维并不是具体的知识