mysql事务(一)

微服务中的事务问题

在这里插入图片描述

单服务中解决数据的一致性问题:
使用事务就ok了。

事务的原则

事务是什么?
在这里插入图片描述
事务的四大原则:
原子性:
要么都完成,要么都不完成。
一致性:
状态是一致的,结果是完整的。
隔离性:
在不同的事务,在操作同样的数据,在A没有commit的时候,别人是看不到的。
持久性:
当进行commit的时候,在进行提交都数据库中。

使用mysql操作事务

场景:
转账场景

代码:

SELECT * FROM t_user

##开启事务
START TRANSACTION;

update t_user SET amount=amount+100 WHERE user_name='xiaoming';

update t_user SET amount=amount-100 WHERE user_name='xiaoh';

COMMIT;

使用工具开启一个事务A,先执行以下代码:
START TRANSACTION;

update t_user SET amount=amount+100 WHERE user_name=‘xiaoming’;

xiaoming 增加了100元 ,然后在当前这个事务A,查询发现
SELECT * FROM t_user
在这里插入图片描述
xiaoming的金额变化了,如果在开启一个事务B,使用
SELECT * FROM t_user
在这里插入图片描述
xiaoming的金额是没有变化,这就是事务的隔离性。也是事务的默认级别。

使用
SELECT @@Global.tx_isolation,@@tx_isolation; 可以查询事务的隔离级别。
默认级别是:可重复读 REPEATABLE-READ
在这里插入图片描述

什么是可重复读呢?

比如 :先开启一个事务A,进行查询语句,
START TRANSACTION;
SELECT * FROM t_user
在事务A未提交的情况下,又开启一个事务B 进行修改操作并进行提交事务。
##开启事务
START TRANSACTION;

update t_user SET amount=amount+100 WHERE user_name=‘xiaoming’;

update t_user SET amount=amount-100 WHERE user_name=‘xiaoh’;
COMMIT;
事务B已经完成了转账的操作了,但是事务A在查询的时候,还会是原来未转账的数据,只有当事务A进行提交,在进行查询操作才会获取最新的数据。

READ UNCOMMITTED
设置事务级别为脏读:
READ UNCOMMITTED ( 读取未提交内容) :即使事务A 进行修改操作未进行commit,但是事务B能读取到最新的数据。

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

Read Committed
Read Committed(读取提交内容):交叉开启两个事务(对同一数据表开启A、B两个事务),A事务只查询数据表中内容,B事务做增删改操作但不commit(提交)
A事务查询不到表中的数据改变的内容
B事务提交
A查到的数据改变(A两次查询,产生不同的结果–不可重复读),这个就是与可重复读的最大区别。

**Serializable **
最高隔离级别
给事务加上共享锁,同时只能有一个事务操作,解决幻读问题
会导致大量超时和锁竞争问题
开启A事务
开启B事务时无法增删该操作

解决可重读(幻读)的问题

1.使用Serializable事务级别来解决幻读的问题,但是效率不高会锁全表
2.使用for update+where 条件来解决幻读问题,这样锁的话,只锁部分数据。

比如:开启事务A 进行修改操作,未进行提交,在其他B会话中使用查询语句+for update,会等待事务A操作的数据锁进行释放(commit之后),B会话才能获取到锁并查询数据出来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值