不同的隔离级别的事务之间的关系是如何的?

譬如一个事务A的隔离级别是repeatable read
我的理解是A事务的一条读的sql语句重复多次结果一样,
不管是否有其他事务对sql影响的数据行/表有没有更改

而若一个事务A的隔离级别是read committed
则是A事务影响的行/表要在这个事务提交之后才能被别的事务看到

那么这两个隔离级别,一个是别人操作对自己读的影响隔离
一个是自己操作对别人读的影响隔离
感觉不太一致啊
因为我觉得要么都是别人操作对自己读的影响隔离
要么都是自己操作对别人读的影响隔离

如何理解?

而serializable就更不好理解了
一个事务如果是serializable,这意思是这个事务执行期间是独占其被影响的数据表/行,其他任何隔离级别的事务中的操作都无法进行吗?还是要两个事务都是serializable隔离级别才会影响彼此?

阅读 5.3k
3 个回答

同一个数据库还能是不同的隔离级别?

    事务隔离等级:

  • 未提交读(READ UNCOMMITED) :两个事务之间互相可见,即使另一个事务没有提交也可以获取数据(不推荐),这就是所谓的脏读
  • 已提交读(READ COMMITED):符合隔离性的基本概念,一个事务进行时,其它已提交的事物对于该事务是可见的,即可以获取其它事务提交的数据。
  • 可重复读(REPEATABLE READ) :InnoDB的默认隔离等级。事务进行时,其它所有事务对其不可见,即多次执行读,得到的结果是一样的!
  • 可串行化SERIALIZABLE): 在读取的每一行数据上都加锁,会造成大量的锁超时和锁征用,严格数据一致性且没有并发是可使用。

clipboard.png

    查看系统的事务隔离级别:show variables like '%iso%';
    开启一个新事务:begin;
    提交一个事务:commit;
    修改事物的隔离级别:set session tx_isolation='read-committed';

事务隔离级别影响的是事务内部,管理好自己的锁就可以了,跟其他事务没有关系,并没有什么冲突
读是不加锁的,rc就是可能读的数据会有变化,rr读的是快照数据不会变化,串行就串行事务之间排队而已
写的情况就是各加各的锁,不管什么隔离级别,有锁就不能更新,没锁就加上锁,互相之间有什么影响?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题