1、事务具有ACID特性 原子性(atomicity):一个事务被事务不可分割的最小工作单元,要么全部提交,要么全部失败回滚。 一致性(consistency):数据库总是从一致性状态到另一个一致性状态,它
1、事务具有ACID特性
2、事务的隔离级别
1)隔离级别的定义与问题
隔离级别 | 脏读可能性 | 不可重复度可能性 | 幻读可能性 | 加锁读 |
READ UNCONMITED | Yes | Yes | Yes | No |
RED COMMITED | No | Yes | Yes | No |
REPEATABLE READ | No | No | Yes | No |
SERIALIZABLE | No | No | No | Yes |
2)如果查看修改和mysql的隔离级别
show variables like 'tx_isolation'; # 查看隔离级别,Mysql8以前
show variables like 'transaction_isolation'; # 查看隔离级别,MySQL8
set global transaction_isolation='READ-COMMITTED'; // 设置隔离级别,阀域READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE
事务的隔离级别可以是Session层的,我们可以对不同的Session设置不同级别:
set session transaction isolation level read uncommitted;
set session transaction isolation level read committed;
set session transaction isolation level repeatable read;
set session transaction isolation level serializable;
3)spring事务隔离级别
Spring事务默认使用数据库的隔离级别,可以通过注解@Transactional中的isolation参数调整Session级的隔离级别。隔离级别是会话级别的,JDBC的java.sql.Connection接口支持隔离级别的设置。
Spring在开启事务时(DataSourceTransactionManager.doBegin),根据注解配置,对Connection的隔离级别进行设置:
MySQL驱动com.mysql.cj.jdbc.ConnectionImpl执行SQL语句调整会话级的隔离级别
3、死锁
死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环。死锁示例:
# 事务一
start transaction;
update account set money=10 where id=1;
update account set money=20 where id=2;
commit;
# 事务二
start transaction;
update account set money=10 where id=2;
update account set money=20 where id=1;
commit;
假设碰巧,事务一和事务二同时执行完第一个update语句,接着准备执行第二条update语句,却发现记录已被对方锁定,然后2个事务都等待对方释放资源,同时持有对方需要的锁,这样就会出现死循环。
为了避免死锁问题,数据库实现了各种死锁检测和死锁超长机制,InnoDB处理死锁的方式是:将持有最少行级排他锁的事务进行回滚。
--结束END--
本文标题: MySQL事务及Spring隔离级别实现原理详解
本文链接: https://www.lsjlt.com/news/9584.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-05-03
2024-05-03
2024-05-03
2024-05-03
2024-05-03
2024-05-03
2024-05-03
2024-05-03
2024-05-03
2024-05-03
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0