lealone / Lealone

比 MySQL 和 MongoDB 快10倍的 OLTP 关系数据库和文档数据库
Other
2.45k stars 516 forks source link

AOTransaction commit 疑问 #95

Closed GrapeBaBa closed 4 years ago

GrapeBaBa commented 4 years ago

查看当前master分支代码,AOTransaction commit 方法需要allLocalTransactionNames,如何保证提交的时候所有participates的localtransactionname已经都回了roottransaction的本地map中的?如果某一个参与者返回的是ERROR,在哪里发起的rollback也没看到这个代码。 另外想问一下,这个commit是所有参与者都返回后才能发起吗?

codefollower commented 4 years ago

在org.lealone.server.TcpServerConnection.executeUpdateAsync那里执行完事务中的一条SQL时就会连同LocalTransactionNames和updateCount一起返回给roottransaction了,等到客户端执行commit时allLocalTransactionNames自然就齐了。

如果事务执行过程中当前SQL执行失败了,org.lealone.sql.StatementBase.YieldableBase.execute()那里会捕获到错误,然后调用rollbackTo(savepointId),回滚当前SQL,并把错误返回到客户端,让客户端决定是否rollback整个事务。

commit是所有参与者都返回后才能发起的。

codefollower commented 4 years ago

ShardingMode下的一些DML语句还没有完整迁移到最新的异步调度器中。

正常的执行流程是,客户端连到一个接入节点,然后由接入节点先解析SQL,看看这条SQL是什么类型的,还得看看是不是ShardingMode,只有在ShardingMode下才会有分布式事务。在ShardingMode下会在org.lealone.sql.router.SQLRouter.executeUpdate(StatementBase, AsyncHandler<AsyncResult>)那里把这条SQL转发到具体节点上执行。

GrapeBaBa commented 4 years ago

好的,我再看看。另外cockroach新增了一种方式,在客户端不等到所有语句都返回结果,直接发起commit,这种优化有意义吗。https://www.cockroachlabs.com/docs/dev/architecture/transaction-layer.html#parallel-commits

codefollower commented 4 years ago

我对cockroach的事务实现方案不了解。