在分布式数据库的场景下,怿对于该数据库的操作最l一定可以成功,所以通过最大努力反复尝试送达操作?/p>
使用最大努力送达型柔性事务的SQL
需要满_{性?/p>
UPDATE xxx SET x=x+1
Sharding-JDBC-transaction
完全Zjava
开发,直接提供jar
包,可直接用maven导入坐标卛_使用?/li>Sharding-JDBC-transaction
需要提供数据库存储事务日志Q配|方法可参见事务理器配|项?/li>elastic-job
实现?code style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 14.4px; padding: 2px 4px; color: #c7254e; border-radius: 4px; background-color: #f9f2f4;">Sharding-JDBC-transaction-async-jobQ通过单配|即可启动高可用作业异步送达柔性事务,启动脚本?code style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 14.4px; padding: 2px 4px; color: #c7254e; border-radius: 4px; background-color: #f9f2f4;">start.sh?/li>Sharding-JDBC-transaction
提供了基于内存的事务日志存储器和内嵌异步作业?/li> // 1. 配置SoftTransactionConfiguration SoftTransactionConfiguration transactionConfig = new SoftTransactionConfiguration(dataSource); transactionConfig.setXXX(); // 2. 初始化SoftTransactionManager SoftTransactionManager transactionManager = new SoftTransactionManager(transactionConfig); transactionManager.init(); // 3. 获取BEDSoftTransaction BEDSoftTransaction transaction = (BEDSoftTransaction) transactionManager.getTransaction(SoftTransactionType.BestEffortsDelivery); // 4. 开启事?/span> transaction.begin(connection); // 5. 执行JDBC /* codes here */ * // 6.关闭事务 transaction.end();
SoftTransactionConfiguration
配置用于配置事务理器?/p>
名称 | cd | 必填 | 默认?/em> | 说明 |
---|---|---|---|---|
shardingDataSource | ShardingDataSource | ?/code> | 事务理器管理的数据?/td> | |
syncMaxDeliveryTryTimes | int | ?/td> | 3 | 同步的事务送达的最大尝试次?/td> |
storageType | enum | ?/td> | RDB | 事务日志存储cd。可选? RDB,MEMORY。用RDBcd自动徏?/td> |
transactionLogDataSource | DataSource | ?/td> | null | 存储事务日志的数据源Q如果storageType为RDB则必?/td> |
bestEffortsDeliveryJobConfiguration | NestedBestEffortsDeliveryJobConfiguration | ?/td> | null | 最大努力送达型内嵌异步作业配|对象。如需使用Q请参?code style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 14.4px; padding: 2px 4px; color: #c7254e; border-radius: 4px; background-color: #f9f2f4;">NestedBestEffortsDeliveryJobConfiguration配置 |
NestedBestEffortsDeliveryJobConfiguration
配置 (仅开发环?用于配置内嵌的异步作业,仅用于开发环境。生产环境应使用独立部v的作业版本?/p>
名称 | cd | 必填 | 默认?/em> | 说明 |
---|---|---|---|---|
zookeeperPort | int | ?/td> | 4181 | 内嵌的注册中心端口号 |
zookeeperDataDir | String | ?/td> | target/test_zk_data/nano/ | 内嵌的注册中心的数据存放目录 |
asyncMaxDeliveryTryTimes | int | ?/td> | 3 | 异步的事务送达的最大尝试次?/td> |
asyncMaxDeliveryTryDelayMillis | long | ?/td> | 60000 | 执行异步送达事务的gq毫U数Q早于此间隔旉的入库事务才?x)被异步作业执?/td> |
yaml
文g,参照CZ?/li>start.sh
脚本启动异步作业?/li>#目标数据库的数据? targetDataSource: ds_0: !!org.apache.commons.dbcp.BasicDataSource driverClassName: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/ds_0 username: root password: ds_1: !!org.apache.commons.dbcp.BasicDataSource driverClassName: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/ds_1 username: root password: #事务日志的数据源. transactionLogDataSource: ds_trans: !!org.apache.commons.dbcp.BasicDataSource driverClassName: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/trans_log username: root password: #注册中心配置 zkConfig: #注册中心的连接地址 connectionString: localhost:2181 #作业的命名空?/span> namespace: Best-Efforts-Delivery-Job #注册中心的等待重试的间隔旉的初始?/span> baseSleepTimeMilliseconds: 1000 #注册中心的等待重试的间隔旉的最大?/span> maxSleepTimeMilliseconds: 3000 #注册中心的最大重试次?/span> maxRetries: 3 #作业配置 jobConfig: #作业名称 name: bestEffortsDeliveryJob #触发作业的cron表达?/span> cron: 0/5 * * * * ? #每次作业获取的事务日志最大数?/span> transactionLogFetchDataCount: 100 #事务送达的最大尝试次? maxDeliveryTryTimes: 3 #执行送达事务的gq毫U数,早于此间隔时间的入库事务才会(x)被作业执?/span> maxDeliveryTryDelayMillis: 60000
事务支持说明
Sharding-JDBC
׃性能斚w的考量Q决定不支持Z致?/code>分布式事务。我们已明确规划U\图,未来?x)支持最l一致性的柔性事务?/p>目前最大努力送达?/code>柔性事务已开发完成?/p>如果不用柔性事务,也会(x)自动包含弱XA
事务支持Q有以下几点说明Q?/p>
完全支持非跨库事务,例如Q仅分表Q或分库但是路由的结果在单库中?/p>
完全支持因逻辑异常D的跨库事务。例如:(x)同一事务中,跨两个库更新。更新完毕后Q抛出空指针Q则两个库的内容都能回滚?/p>
不支持因|络、硬件异常导致的跨库事务。例如:(x)同一事务中,跨两个库更新Q更新完毕后、未提交之前Q第一个库LQ则只有W二个库数据提交?/p>