版本:v6.1.0
请教下,今天用sysbench 压测tidb的时候,出现了Write conflict,事务模型用的是 tidb_txn_mode
是pessimistic,不知道为什么会出现这种Write conflict?
悲观模式下,autocommit开启时 会先以乐观模式提交,如果有冲突转入悲观模式。 和乐观模式相比,悲观模式在DML阶段对key加锁,这样在提交前就能阻塞住其他会话,在提交时 仍然会按照乐观模式的prewrite+commit方式执行,在此阶段有可能会有写写冲突。
老师,悲观模式下,autocommit开启时 会先以乐观模式提交,如果有冲突转入悲观模式---->举个例子,假设现在autocommit 系统变量 等于ON,我直接执行了一条update语句(没有begin和commit语句),那么这条update语句最后提交事务时候,就是按照乐观事务的模式提交的嘛?(不需要在修改数据时候判断此条数据是否有锁,到了提交阶段再判断是否有Write conflict或者是否有锁冲突),这么理解对嘛
pessimistic lock retry limit reached
在冲突非常严重的场景下,或者当发生 write conflict 时,乐观事务会直接终止,而悲观事务会尝试用最新数据重试该语句直到没有 write conflict。因为 TiDB 的加锁操作是一个写入操作,且操作过程是先读后写,需要 2 次 RPC。如果在这中间发生了 write conflict,那么会重试。每次重试都会打印日志,不用特别关注。重试次数由 pessimistic-txn.max-retry-count 定义。
https://docs.pingcap.com/zh/tidb/v4.0/troubleshoot-lock-conflicts#其他锁相关错误
写写冲突发生在 prewrite 阶段,当发现有其他的事务在写当前 Key (data.commit_ts > txn.start_ts),则会发生写写冲突。
这个 data.commit_ts > txn.start_ts 应该怎么理解呀?我的测试是这样的:
SESSION1:
SQL>begin;
SESSION2:
SQL>begin;
SQL>update test set name=‘DDD’ where id=4;
SQL>commit;
SESSION1:
SQL>insert into test values(4,‘ddddddd’);
ERROR 1062 (23000):Duplicate entry ‘4’ for key ‘PRIMARY’
查看tidb.log,提示pessimistic write conflict的报错内容。
我的SESSION2里面已经commit了,为啥还提示写写冲突呢?
你问的这个是乐观事务写写冲突中的,但看你测试好像是悲观事务
按照你的测试过程跑了下,悲观事务,没出现pessimistic write conflict
[2022/07/29 17:41:59.575 +08:00] [INFO] [conn.go:1115] [“command dispatched failed”] [conn=493] [connInfo=“id:493, addr:10.1.48.44:45680 status:11, collation:utf8_general_ci, user:root”] [command=Query] [status=“inTxn:1, autocommit:1”] [sql=“insert into sbtest99 values(1,200000,‘18018173308’,‘18018173308’)”] [txn_mode=PESSIMISTIC] [err=“[kv:1062]Duplicate entry ‘1’ for key ‘PRIMARY’”]
如果是乐观事务,在SESSION1在insert的时候不会报错,在COMMIT的时候会报write conflict,未报Duplicate entry
ERROR 9007 (HY000): Write conflict, txnStartTS=434919573708603394, conflictStartTS=434919572109524993, conflictCommitTS=434919580091809794, key={tableID=759, indexID=1, indexValues={200000, 1, }} primary={tableID=759, indexID=1, indexValues={200000, 1, }} [try again later]
请问下老师,我们这里的tidb版本是5.3.1版本,设置的是悲观事务模式,系统变量autocommit为ON,tidb_disable_txn_auto_retry 的值为ON,如果语句执行完自动提交的话,那么先会以乐观事务模式提交,如果在提交过程中遇到了写写冲突,那么是不是该事务就会转为悲观事务模式,然后在悲观事务模式下,进行写写冲突的重试,重试的步骤里面是不是会重新获取事务的start.tso,重新执行 语句,重新开始两阶段提交,是这么1个过程嘛
该主题在最后一个回复创建后60天后自动关闭。不再允许新的回复。