Mysql 隔离级别

mysql隔离级别

事务隔离级别举例说明 <—失效了>.<

首先,隔离级别讨论的是事务之间的,数据可见性问题

  • Read uncommited: 一个事务可以看到其它事务未提交的数据(脏读)
  • Read commited: 如果有事务update,读操作的事务要等update结束才能读(避免脏读,造成不可重复读)
    可能一个事务中的两次读操作,看到的数据不同(其它事务update)
  • Repeatable read(mysql默认): 当有事务读操作,不允许其它事务update(可重复读,但因为允许insert,可能幻读)
  • Serializable read: 事务按串行化顺序进行

例子
脏读例子
会话B开启一个事务,把id=1的name为武汉市修改成温州市,此时另外一个会话A也开启一个事务,读取id=1的name,此时的查询结果为温州市,会话B的事务最后回滚了刚才修改的记录,这样会话A读到的数据是不存在的,这个现象就是脏读。(脏读只在读未提交隔离级别才会出现)

不可重复读(Non-Repeatable Read)例子

会话A开启一个事务,查询id=1的结果,此时查询的结果name为武汉市。接着会话B把id=1的name修改为温州市(隐式事务,因为此时的autocommit为1,每条SQL语句执行完自动提交),此时会话A的事务再一次查询id=1的结果,读取的结果name为温州市。会话B再此修改id=1的name为杭州市,会话A的事务再次查询id=1,结果name的值为杭州市,这种现象就是不可重复读。

幻读(Phantom)例子

会话A开启一个事务,查询id>0的记录,此时会查到name=武汉市的记录。接着会话B插入一条name=温州市的数据(隐式事务,因为此时的autocommit为1,每条SQL语句执行完自动提交),这时会话A的事务再以刚才的查询条件(id>0)再一次查询,此时会出现两条记录(name为武汉市和温州市的记录),这种现象就是幻读。

如果要保证字段 a 减一后大于0,可以在where里加入条件(但是会有幂等问题!)

UPDATE mytable SET a = a-1 WHERE (a > 1 AND id = 222)
UPDATE mytable SET a = IF(a < 1, 0, a - 1) WHERE id = 222

2PL两段锁

事务只有提交或者回滚是解锁阶段,其余为加锁阶段;
把最热点的提交记录放在事务最后,可增加吞吐量。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值