You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Seata 的4 种分布式事务解决方案,分别是 AT 模式、TCC 模式、Saga 模式和 XA 模式,这次我们来主要讲讲Seata中的AT模式。
AT 模式是一种无侵入的分布式事务解决方案。在 AT 模式下,用户只需关注自己的“业务 SQL”,用户的 “业务 SQL” 作为一阶段,Seata 框架会自动生成事务的二阶段提交和回滚操作。可以发现AT模式的特点,只需关注自己的业务sql。
对业务无入侵的一种分布式事务模式。Seata是怎么实现的呢?在Java体系中,Seata通过对用户的DataSource进行代理,将用户执行的相关SQL拦截并执行AT模式的相关逻辑。通过这种方式将AT模式具体逻辑对用户进行屏蔽,尽可能使用户保留原有的编码习惯。
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
Seata 的4 种分布式事务解决方案,分别是 AT 模式、TCC 模式、Saga 模式和 XA 模式,这次我们来主要讲讲Seata中的AT模式。
AT 模式是一种无侵入的分布式事务解决方案。在 AT 模式下,用户只需关注自己的“业务 SQL”,用户的 “业务 SQL” 作为一阶段,Seata 框架会自动生成事务的二阶段提交和回滚操作。可以发现AT模式的特点,只需关注自己的业务sql。
对业务无入侵的一种分布式事务模式。Seata是怎么实现的呢?在Java体系中,Seata通过对用户的DataSource进行代理,将用户执行的相关SQL拦截并执行AT模式的相关逻辑。通过这种方式将AT模式具体逻辑对用户进行屏蔽,尽可能使用户保留原有的编码习惯。
那么在Golang体系下,我们如何设计,使得用户可以在Golang中体验到与Java一样的无侵入式的AT分布式事务模式?
Go的数据库Driver设计
Go 语言中,所有关系型数据库的客户端都需要实现如下所示的驱动接口:
database/sql/driver.Driver 接口中只包含一个 Open 方法,该方法接收一个数据库连接串作为输入参数并返回对应数据库的连接,这个返回的连接仍然是一个接口,整个database/sql/driver库中的全部接口可以构成如下所示的树形结构:
我们可以看到,driver.Conn 是整个操作数据库的核心接口,而 driver.Conn 统一从 driver.Driver 创建出来,因此在Go体系下。要实现无侵入的AT模式的话,我们可以对 driver.Driver 接口进行代理,对 driver.Driver 创建出的 driver.Conn 实例统一返回Seata的代理 driver.Conn。
因此,我们可以在Seata-Go中增加类似sql.Open的函数,然后返回一个被处理过的*sql.DB实例
通过上述的方式,我们将*sql.DB 中的 driver.Connector 成员实例替换为了Seata的 driver.Connector 代理对象。
AT模式下,SQL执行的流程
既然要执行AT模式,那么首先就需要用户触发一个开启事务的动作,当调用了 sql.DB.BeginTx 时,最终会调用到 driver.Conn.BeginTx,这个时候 Seata-Go 就会通过先前的 driver.Connector 代理对象,返回一个被代理过的 driver.Tx
当开启一个 driver.Tx 之后,则会有一个 driver.Conn 和当前这个 driver.Tx 进行绑定,因此接下来所有这个事务的操作,其发生的SQL都将被 Seata-Go 的代理 driver.Conn 对象所代理执行。
这里便举 driver.Conn 中执行 Exec 方法
当前 executor执行用户的SQL操作时,首先会触发SQLHook的前置操作,当SQL之前完毕之后,又会触发SQLHook的后置逻辑
Beta Was this translation helpful? Give feedback.
All reactions