如何实现MySQL事务及弹簧隔离级别

  介绍

这篇文章主要讲解了如何实现MySQL事务及弹簧隔离级别,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。

<强> 1,事务具有酸特性

    <李>原子性(原子性):一个事务被事务不可分割的最小工作单元,要么全部提交,要么全部失败回滚。 <李>一致性(一致性):数据库总是从一致性状态到另一个一致性状态,它只包含成功事务提交的结果李 <>李隔离型(隔离):事务所做的修改在最终提交一起,对其他事务是不可见的李 <>李持久性(耐久性):一旦事务提交,则其所做的修改就会永久保存到数据库中。
      李,

<强> 2,事务的隔离级别

1)隔离级别的定义与问题

    <李>读未提交(读未提交):事务的修改,即使没有提交,对其他事务也都是可见的。事务能够读取未提交的数据,这种情况称为脏读。 <李>读承诺(读已提交):事务读取已提交的数据,大多数数据库的默认隔离级别。当一个事务在执行过程中,数据被另外一个事务修改,造成本次事务前后读取的信息不一样,这种情况称为不可重复读。 <李> PEPEATABLE读(可重复读):这个级别是MySQL的默认隔离级别,它解决了脏读的问题,同时也保证了同一个事务多次读取同样的记录是一致的,但这个级别还是会出现幻读的情况。幻读是指当一个事务一个读取某一个范围的数据时,另一个事务B在这个范围插入行,一个事务再次读取这个范围的数据时,会产生幻行。特别说明:InnoDB和XtraDB存储引擎通过多版本并发控制(MVCC多版本并发控制),解决了幻读问题,它使用间隙锁(锁键)锁定查询涉及的行和索引中的间隙,防止幻影行的插入。 <李>序列化(可串行化):这个事务是最高的隔离级别,它强制事务串行执行,避免了幻读问题。简单来说,序列化会在读取的每一行数据上都加锁,所以可能会导致大量的超时和锁竞争李
隔离级别脏读可能性不可重复度可能性幻读可能性加锁读阅读UNCONMITEDYesYesYesNoRED COMMITEDNoYesYesNoREPEATABLE READNoNoYesNoSERIALIZABLENoNoNoYes

2)如果查看修改和MySQL的隔离级别

设置会话事务隔离级别读取未提交;
  设置会话事务隔离级别读取提交;
  设置会话事务隔离级别可重复读;
  设置会话事务隔离级别可序列化的;

3)春天事务隔离级别

春天事务默认使用数据库的隔离级别,可以通过注解@ transactional中孤立的参数调整会话级的隔离级别。隔离级别是会话级别的,JDBC的java.sql。连接接口支持隔离级别的设置。

如何实现MySQL事务及弹簧隔离级别

春在开启事务时(DataSourceTransactionManager。doBegin),根据注解配置,对连接的隔离级别进行设置:

如何实现MySQL事务及弹簧隔离级别

MySQL驱动com.mysql.cj.jdbc。ConnectionImpl执行SQL语句调整会话级的隔离级别

如何实现MySQL事务及弹簧隔离级别

<强> 3,死锁

死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环。死锁示例:

 #事务一
  开始事务;
  更新账户设置钱=10,id=1;
  更新帐户设置钱=20,id=2;
  提交;
  
  #事务二
  开始事务;
  更新帐户设置钱=10,id=2;
  更新账户设置钱=20,id=1;
  之前提交; 

假设碰巧,事务一和事务二同时执行完第一个更新语句,接着准备执行第二条更新语句,却发现记录已被对方锁定,然后2个事务都等待对方释放资源,同时持有对方需要的锁,这样就会出现死循环。

为了避免死锁问题,数据库实现了各种死锁检测和死锁超长机制,InnoDB处理死锁的方式是:将持有最少行级排他锁的事务进行回滚。

如何实现MySQL事务及弹簧隔离级别