TiDB的事务隔离级别如何选择

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】
【遇到的问题】
【复现路径】做过哪些操作出现的问题
【问题现象及影响】
https://docs.pingcap.com/zh/tidb/stable/transaction-isolation-levels#tidb-事务隔离级别

TiDB支持乐观事务模型、悲观事务模型、SI、REPEATABLE READ、READ COMMITTED,实际使用中该如何选择?

【附件】

请提供各个组件的 version 信息,如 cdc/tikv,可通过执行 cdc version/tikv-server --version 获取。

这个我觉得根据业务场景和需求, 4种隔离级别中 一般都是 读已提交吧

Oracle是只有RC,MySQL的默认隔离级别是RR,但是RDS-MySQL是RC,看业务,RC级别会比较轻量些

大部分会选择悲观,然后 READ COMMITTED 就差不多够用了

金融场景都是悲观锁,RC+ select for update

建议RC,TIDB在RR隔离级别下为了保证不产生幻读,会存在读写冲突,代价比较大

2 个赞

与MySQL兼容的话,就选RC

一般的开发,默认就好,隔离级别高了容易锁表导致一些业务不能正常进行

TiDB的RR级别是怎么实现的?有空得研究下

是的,要选择合适的隔离级别

可以参考这两篇,快照读隔离级别主要解决幻读问题,解决幻读问题就需要等待其它事务prewrite时的锁,如果其它事务时大事务,那么就可能较大的锁冲突,这是快照读的问题,好处就是只是在事务开始时候获取时间戳。RC隔离级别则不会发生这种读写冲突,但是事务中的每一个语句都要获取时间戳,成本在时间戳上。不过综合考虑还是悲观锁+RC隔离级别可能效果会更好。

快照读的实现用途和原理可以参考下面两篇文章:

不同场景选择不同隔离级别,常用RC隔离级别

没其他要求的话就RC.

1 个赞

建议选择RC隔离级别 + 悲观事务

TiDB 默认是SI + 悲观事务吧?

默认是SI + 悲观事务吧,si实际上就是RR,但是rr感觉并不如rc靠谱

金融行业一般采用RC+悲观锁

RC+悲观锁

Oracle是只有RC,MySQL的默认隔离级别是RR,但是RDS-MySQL是RC,看业务,RC级别会比较轻量些