spring事务和mysql事务的实现原理和一些问题解答

问题列表:

1.spring事务是怎么实现的?

2.有人说开启了事务的方法就不会有多线程问题对不对?

3.mysql如何实现事务的acid的?

4.mysql在满足数据的事务特性又做了哪些设计来提高并发?

下面我针对这几个问题谈谈自己的理解:

 

1.spring事务是怎么实现的

首先大家都知道spring事务是使用的aop来实现的,那spring容器又是怎么设计的,他是通过beanfactorypostProcess重新修改了beandifinition把这个功能赋给bean的

2.开启了事务的方法依然会有多线程问题

spring事务只负责传播行为的设计,只是在方法的开始和增加了回滚,提交特性,比如 开始执行方法A ->开启事务->方法b->方法c->事务提交,保证了在这个过程事务的原子性,如果b方法引用了外部的全局变量在多线程执行下还是有数据问题的

3.mysql如何实现事务的acid的

先说下acid的特性:

  • 原子性(Atomicity,或称不可分割性)

  • 一致性(Consistency)

  • 隔离性(Isolation)

  • 持久性(Durability)

1.通过redolog来实现持久性:

当事务提交(COMMIT)时,必须先将该事务的所有日志写入到重做日志文件进行持久化redo log file,待事务的COMMIT操作完成才算完成

2.undo log 来实现事务原子性

原子性在于事务回滚可以保证撤销所有的执行过的sql;

当事务对数据库进行修改时,InnoDB 会生成对应的 undo log;

如果事务执行失败或调用了 rollback,导致事务需要回滚,便可以利用 undo log 中的信息将数据回滚到修改之前的样子;

undo log 属于逻辑日志,它记录的是 sql 执行相关的信息。当发生回滚时,InnoDB 会根据 undo log 的内容做与之前相反的工作;

3.mysql innodb通过锁机制,mvcc实现隔离性(和具体的隔离级别有关系)

这边要讲的就太多了,后续会开新的篇幅来讲解,我这边先做个总结:rr隔离级别通过锁和mvcc(实现原理也是undolog来做的)实现的,rc的隔离较低会有不可重复读问题;

4.一致性

mysql数据一致性的保障其实要靠前面三个,如果保障不了前面三个就可能会有数据不一致的问题,另外数据的一致性也需要应用层来保障比如转账:a,b两个账户转账总的数据不能少

 

4.mysql在满足数据的事务特性又做了哪些设计来提高并发?

这边谈论的前提条件是:innodb+RR隔离级别

mysql的RR隔离级别是和概念上的rr不一样,它不仅满足可重复读,而且解决了幻读(这点很多人不知道),怎么实现的呢:

1.mysql提供了行锁,间隙锁,临建锁等各种锁来保证

2.mysql打破了2pc原则,一阶段查询的记录不满足条件的数据会释放掉锁

3.mysql针对快照读比如普通的select使用了mvcc数据多版本的无锁设计来提高并发,针对select  for update等加锁

4.其他..我暂时还没研究到

 

你可能感兴趣的:(Mysql)