运行MS DTC服务
在 Service Manager 中,MS DTC 服务应标记为 "自动",以确保在启动 SQL Server 服务时该服务正在运行。
若要为 XA 事务启用 MS DTC,必须执行以下步骤(在 Windows Vista 和更高版本上):
1.单击“开始”按钮,在“开始搜索”框中键入 dcomcnfg,然后按 Enter 打开“组件服务” 。 也可以在“开始搜索”框中键入 %windir%\system32\comexp.msc 打开“组件服务” 。
2.依次展开“组件服务”、“计算机”、“我的电脑”和“分布式事务处理协调器”。
3.右键单击“本地 DTC”,再选择“属性” 。
4.单击“本地 DTC 属性”对话框上的“安全”选项卡 。
5.选中“启用 XA 事务”复选框,然后单击“确定” 。 此操作将导致 MS DTC 服务重启。
6.再次单击“确定”以关闭“属性”对话框,然后关闭“组件服务” 。
7.停止然后重新启动 SQL Server,确保它与 MS DTC 更改同步。 (此步骤在 SQL Server 2019、SQL Server 2017 CU 16 及更高版本中是可选的。)
配置JDBC分布式事务组件
下载相关文件
当前版本官网地址:
https://docs.microsoft.com/zh-cn/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-ver16
XA相关文件包含在子文件夹中。
配置JDBC驱动程序分布式事务组件
1.将新 sqljdbc_xa.dll 从 JDBC 驱动程序安装目录复制到将参与分布式事务的每个 SQL Server 计算机的 Binn 目录中。
注:如果将 XA 事务用于32位 SQL Server,请使用 x86 文件夹中的 sqljdbc_xa.dll 文件,即使 SQL Server 安装在 x64 处理器上也是如此。 如果在 x64 处理器上将 XA 事务与64位 SQL Server 一起使用,请使用 x64 文件夹中的 sqljdbc_xa.dll 文件。
2.在将参与分布式事务的每个 SQL Server 实例上执行数据库脚本 xa_install。 此脚本将安装 sqljdbc_xa.dll 调用的扩展存储过程。 这些扩展存储过程实现了分布式事务,并为 SQL Server 的 Microsoft JDBC 驱动程序提供 XA 支持。 需要以 SQL Server 实例的管理员身份运行此脚本。
注:从累积更新 16 开始的 SQL Server 2017 和 SQL Server 2019 中,JDBC XA 分布式事务组件包含在 SQL Server 引擎中,可以通过系统存储过程启用或禁用。 来自驱动程序的 sqjdbc_xa.dll 不是必需的,因此建议改为这些服务器版本启用服务器组件。 若要使用 JDBC 驱动程序启用必需组件来执行 XA 分布式事务,请执行以下存储过程。
EXEC sp_sqljdbc_xa_install
若要禁用先前安装的组件,请执行以下存储过程。
EXEC sp_sqljdbc_xa_uninstall
本质是将早先版本扩展存储过程名称作为新版本系统存储过程的同义词。
3.若要为特定用户授予使用 JDBC 驱动程序参与分布式事务的权限,请将该用户添加至 SqlJDBCXAUser 角色。
sqljdbc_xa.dll 的版本
每个 SQL Server 实例上,一次只能配置一个版本的 sqljdbc_xa.dll 程序集。 应用程序可能需要使用不同版本的 JDBC driver,才能使用 XA 连接来连接到同一个 SQL Server 实例。 在这种情况下,必须在 SQL Server 实例上安装最新的 JDBC driver 附带的 sqljdbc_xa.dll。
打开将参与分布式事务 SQL Server 计算机的 Binn 目录。 选择 sqljdbc_xa.dll 程序集。
在 Windows Vista 或更高版本上:右键单击“sqljdbc_xa.dll”,然后选择“属性”。 然后单击 "详细信息" 选项卡。"文件版本" 字段显示 SQL Server 实例上当前安装的 sqljdbc_xa.dll 的版本。
为自动回滚尚未准备好的事务配置服务器端超时
有两个注册表设置(DWORD 值)来控制分布式事务的超时行为:
- XADefaultTimeout(以秒为单位):在用户未指定任何超时时使用的默认超时值。 默认值为 0。
- XAMaxTimeout(以秒为单位):用户可以设置的最大超时值。 默认值为 0。
这些设置特定用于 SQL Server 实例,应在以下注册表项下创建:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL<version>.<instance_name>\XATimeout
对于在 64 位计算机中运行的 32 位 SQL Server,应在以下项的下面创建注册表设置:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server\MSSQL<version>.<instance_name>\XATimeout
将为每个开始的事务设置超时值,并且在超时过期后由 SQL Server 回滚该事务。 超时具体取决于这些注册表设置以及用户通过 XAResource.setTransactionTimeout() 指定的设置。 有关如何解释这些超时值的一些示例如下所示:
-
XADefaultTimeout = 0, XAMaxTimeout = 0
意味着不使用默认超时值,并且在客户端上不强制执行最大超时。 在这种情况下,只有在客户端使用 XAResource.setTransactionTimeout 设置超时的情况下,事务才会有超时。 -
XADefaultTimeout = 60, XAMaxTimeout = 0
表示如果客户端不指定任何超时,所有事务的超时都为 60 秒。 如果客户端指定超时,将使用该超时值。 不强制执行最大值超时值。 -
XADefaultTimeout = 30, XAMaxTimeout = 60
表示如果客户端不指定任何超时,所有事务的超时都为 30 秒。 如果客户端指定了任何超时,则只要此时间小于 60 秒(最大值),就将使用它。 -
XADefaultTimeout = 0, XAMaxTimeout = 30
表示如果客户端不指定任何超时,所有事务的超时都为 30 秒(最大值)。 如果客户端指定了任何超时,则只要此时间小于 30 秒(最大值),就将使用它。
网友评论