RHStudio中的数据库事务支持
事务类型
rhstudio - 由rhstudio服务器实施的事务。 rhstudio事务可以应用于多个数据源,在这种情况下,提交/回滚同时适用于所有参与的数据源。
请注意,由于这种类型的事务不是使用双阶提交协议实现的,所以在系统故障的情况下,有可能数据库提交将应用于rhstudio中涉及的一部分但不是全部的数据源事务,但是这种可能性很小。
分布式(Distributed) - 使用rhstudio支持的第三方事务管理器实现的事务,经过配置以后,事务管理范围涵盖参与其中的所有数据源的交互。
第三方事务管理器通常使用双阶提交协议,这将在发生故障时确保更好的可靠性,但在某些情况下可能会产生显着的性能开销。 rhstudio目前支持Atomikos。允许使用JOTM,但不鼓励这种方式。
与第三方事务管理器的集成是企业功能,并且rhstudio的免费版本不支持该功能。
自动提交 - 每个SQL语句本身都是一个事务,在发布时立即执行。一个错误对同一服务器端调用中的前一个或后续语句没有影响。
事务类型定义
事务范围
默认情况下,事务范围由服务器端调用的范围隐式定义。当服务器端调用开始时,事务开始,并且在调用结束时提交,除非中间调用发生未处理的异常,在这种情况下将执行回滚。
可以使用提交和回滚插件(在数据库模型类别中)显式控制事务,然后隐式启动新事务。
服务器端调用
服务器端调用通常指的是以下之一:
1.最常见的是使用<功能服务模型(rhstudio/Basic/Service)>实现的模型,并从客户端进行调用。请注意,如果服务B位于从客户端调用的服务A中,则只有一个服务器端调用,其事务范围由A定义。
例如:使用<显示文件(rhstudio/Display Actions/Show File)>模板实现的模型。注意,如上所述,即使在<显示文件>包含功能服务模型的情况下,调用范围由<显示文件>模型定义。
2.使用<web服务(rhstudio/Basic/Callable Service)>模板实现的模型。
该模型不是由显示模型实现的模型(非客户端模型),它是使用<功能服务模型(rhstudio/Basic/Service)>实现的子模型。
3.服务器端计时器(Timer)的实例。
当未安装客户端数据库(clientSideDatabase = server)时,使用某一个(rhstudio/Database/ ...)插件实现并从客户端调用的模型。
主数据源
每个服务器端调用都有一个主数据源。默认情况下,主数据源为jdbc/Main,但是可以通过将模型定义的dataSource属性设置为应用程序中配置的另一个数据源的名称来覆盖此设置。
主数据源与附加设置一起确定执行什么类型的事务。
设置
以下设置会影响到使用的事务类型:
数据源
模型共享属性。
请参阅主数据源定义。
<Auto Commit>
数据库插件的触发器。
如果指定了该触发器,并且接收到一个布尔值为'Yes'的值,则数据库操作将使用auto-commit方式执行,而不管任何其他的活动事务。
auto_commit_data_sources
上下文/配置文件中的参数。
指定使用自动提交事务访问哪些数据源。
如果参数丢失,则除主数据源外的所有数据源都将被访问。
如果数据源配置为分布式事务,并且执行了这样的事务,那么auto_commit_data_sources定义将被忽略。
第三方事务管理器配置设置
在上下文/配置文件中。
指定是否可以使用分布式事务,哪些数据源可以参与(有关详细信息,请参见下表)。
目前可以使用Atomikos和JOTM事务管理器。 请参阅下面的具体配置细节
配置矩阵
下表总结了所有可能的配置以及每个数据源上使用的事务类型。
# |
配置 |
数据源和事务类型 |
主数据源
分布式事务配置(Distributed) |
auto_commit_data_sources 参数 |
主数据源 |
1 |
2 |
3 |
4 |
1 |
No |
未定义 |
Rhstudio |
Auto-commit |
N/A |
Auto-commit |
N/A |
2 |
Yes |
未定义 |
分布式Distributed |
分布式Distributed |
N/A |
Auto-commit |
N/A |
3 |
No |
定义, 主数据源未定义 |
Rhstudio |
Rhstudio |
Auto-commit |
Rhstudio |
Auto-commit |
4 |
Yes |
定义, 主数据源未定义 |
分布式Distributed |
分布式Distributed |
分布式Distributed |
Auto-commit |
Auto-commit |
5 |
No |
定义, 主数据源定义 |
Auto-commit |
Rhstudio |
Auto-commit |
Rhstudio |
Auto-commit |
6 |
Yes |
定义, 主数据源定义 |
分布式Distributed |
分布式Distributed |
分布式Distributed |
Auto-commit |
Auto-commit |
上述数据源1至4的配置如下表所示:
数据源 |
包含auto_commit_data_sources 参数 |
分布式事务配置(Distributed) |
1 |
No |
Yes |
2 |
Yes |
Yes |
3 |
No |
No |
4 |
Yes |
No |
使用第三方事务管理器
一旦安装了第三方事务管理器并且配置了应用程序(见下文),每当发生服务器端调用时发生分布式事务,
定义调用的模型(通常基于Rhstudio/Basic/Server插件) 有一个dataSource属性,其值是配置为实现事务管理器的数据源之一。
Atomikos
安装介绍
配置:
下载transactions.properties并将其放在您选择的目录中,如tomcat的conf文件夹(简称<Path>)。
将以下JVM属性添加到您的配置中:
-Dcom.atomikos.icatch.file=<Path>/transactions.properties
-Dcom.atomikos.icatch.tm_unique_name=<TM_UNIQUE_NAME>
<TM_UNIQUE_NAME>是您选择的唯一标识符。
将以下内容添加到您的配置/上下文文件中:
<Parameter
name="resource_handler_class_name"
value="tersus.enterprise.EnterpriseResourceHandler" />
<Resource name="UserTransaction" auth="Container"
type="javax.transaction.UserTransaction"
factory="com.atomikos.icatch.jta.UserTransactionFactory" />
要将现有数据源转换为参与分布式事务的一个数据源,请执行以下更改:
SQL Server:
修改前:
<Resource name="<Name>"
type="javax.sql.DataSource"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
maxActive="<MaxActive>" maxIdle="<MaxIdle>" maxWait="<MaxWait>"
username="<Username>"
password="<Password>"
url="<URL>"
validationQuery="<Query>" />
修改后:
<Resource name="<Name>"
type="com.atomikos.jdbc.AtomikosDataSourceBean"
auth="Container"
factory="com.atomikos.tomcat.BeanFactory"
uniqueResourceName="<UniqueResourceName>"
xaDataSourceClassName="com.microsoft.sqlserver.jdbc.SQLServerXADataSource"
xaProperties.serverName="<ServerName/IPAddress>"
xaProperties.portNumber="<PortNumber>"
xaProperties.databaseName="<DatabaseName>"
xaProperties.user="<Usename>"
xaProperties.password="<Password>"
minPoolSize="1"
maxPoolSize="30"
testQuery="<Query>" />
Oracle
修改前:
<Resource name="<Name>"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.OracleDriver"
maxActive="<MaxActive>" maxIdle="<MaxIdle>" maxWait="<MaxWait>"
username="<Username>"
password="<Password>"
url="<URL>"
validationQuery="<Query>" />
修改后:
<Resource name="<Name>"
type="com.atomikos.jdbc.AtomikosDataSourceBean"
auth="Container"
factory="com.atomikos.tomcat.BeanFactory"
uniqueResourceName="<UniqueResourceName>"
xaDataSourceClassName="oracle.jdbc.xa.client.OracleXADataSource"
xaProperties.URL="<URL>"
xaProperties.user="<Usename>"
xaProperties.password="<Password>"
minPoolSize="1"
maxPoolSize="30"
testQuery="<Query>" />
建议:
<UniqueResourceName>是唯一的名称,但我们建议您使用标准的命名约定,例如<ServerName/IPAddress>:<DatabaseName>
<PortNumber>是DBMS监听的tcp-ip端口(默认为1433)