mysql事务

事务隔离级别

  • 读未提交(read uncommitted): 一个事务还没提交,它的变更就能被其它事务看到
  • 读已提交(read committed) 一个事务提交后,其变更才会被其他事务看到
  • 可重复读(repeatable read) 一个事务执行过程中看到的数据,和该事务在启动时看到的数据一致。自然未提交的变更对其他事务也是不可见的。一个事务启动时,能够看到所有已提交的事务结果。但之后的该事务执行期间,其他事务的更新对它就不可见了
  • 串行化(serializable) 对同行记录,“写”加“写锁”,“读”加“读锁”。出现读写锁冲突时,后访问的事务必须等前一个事务执行完成

问题

  • 脏读:在事务A读取了事务B中已修改但未提交的数据
  • 不可重复读:当有事务A对某记录需要多次查询;而事务B在其中对该记录修改并提交,那么事务A则会出现前后读取到的数据不一致
  • 幻读:当同一个查询在不同时间产生不同的行集时,所谓的幻影问题就会发生在一个事务中。 例如,如果 SELECT 执行两次,但第二次返回第一次未返回的行,则该行是“幻影”行;这里按照我的l理解不是在该事务中返回结果不一致;而是在插入时会提示已存在该记录,但是实际上是没有查出来,因此这一行是"幻影";如果两次的查询第一次返回10条第二次返回11条,这个应属于不可重复读

样例

读未提交(read uncommitted)

存在脏读、不可重复读、幻读的问题
脏读样例:
在这里插入图片描述

读已提交(read committed)

解决脏读的问题,存在不可重复读、幻读的问题
不可重复读样例:
在这里插入图片描述

可重复读(repeatable read)

解决脏读、不可重复读的问题,存在幻读的问题
这里说一下不可重复读:虽然在会话一中查不到会话二对中该记录的修改,但是实际上是已经修改的,因此如果是会话一在此时使用UPDATE或者DELETE则不会命中,这种情况则是幻读了;
update test set name = 3 where id = 1 and name = 1;
幻读样例:
在这里插入图片描述

串行化(serializable)

解决脏读、不可重复读、幻读;但性能最低
串行化样例:(估计有些地方不对)
在这里插入图片描述

部分SQL

SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT
	@@tx_isolation;
	
	
BEGIN;
	SELECT NAME 
	FROM
		test 
	WHERE
		id = 1;
		
		
		
	INSERT INTO test ( NAME, id )
	VALUES
	( '1', 1 );
COMMIT;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值