{"id":50630,"date":"2023-07-04T22:57:39","date_gmt":"2023-03-15T02:00:57","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%9c%a8wsl-ubuntu%e4%b8%8a%e8%bf%90%e8%a1%8cscalardb%ef%bc%88%e5%88%9b%e5%bb%ba%e7%a4%ba%e4%be%8b%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e9%83%a8%e5%88%86%ef%bc%89%e3%80%82\/"},"modified":"2024-04-30T11:59:54","modified_gmt":"2024-04-30T03:59:54","slug":"%e5%b0%9d%e8%af%95%e5%9c%a8wsl-ubuntu%e4%b8%8a%e8%bf%90%e8%a1%8cscalardb%ef%bc%88%e5%88%9b%e5%bb%ba%e7%a4%ba%e4%be%8b%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e9%83%a8%e5%88%86%ef%bc%89%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%9c%a8wsl-ubuntu%e4%b8%8a%e8%bf%90%e8%a1%8cscalardb%ef%bc%88%e5%88%9b%e5%bb%ba%e7%a4%ba%e4%be%8b%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e9%83%a8%e5%88%86%ef%bc%89%e3%80%82\/","title":{"rendered":"\u5c1d\u8bd5\u5728WSL Ubuntu\u4e0a\u8fd0\u884cScalarDB\uff08\u521b\u5efa\u793a\u4f8b\u5e94\u7528\u7a0b\u5e8f\u90e8\u5206\uff09"},"content":{"rendered":"<p>\u672c\u7bc7\u6587\u7ae0\u662f\u6709\u5173\u521b\u5efa\u6837\u672c\u5e94\u7528\u7a0b\u5e8f\u90e8\u5206\uff0c\u5728\u6b64\u6211\u5c06\u8fd0\u884c ScalarDB \u7684\u6837\u672c\u5e94\u7528\u7a0b\u5e8f\u3002<\/p>\n<p>&#8220;Environment setup section is here.&#8221;<br \/>\n\u300c\u73af\u5883\u642d\u5efa\u90e8\u5206\u5728\u8fd9\u91cc\u3002\u300d<\/p>\n<h1>\u4f7f\u7528ScalarDB\u8fdb\u884c\u64cd\u4f5c\u3002<\/h1>\n<p>ScalarDB\u7684\u64cd\u4f5c\u7ec4\u4ef6\u6709\u4e24\u4e2a\uff0c\u5206\u522b\u662fStorage\u7ec4\u4ef6\u548cTransaction\u7ec4\u4ef6\u3002<\/p>\n<h3>\u5b58\u50a8\u7ec4\u4ef6<\/h3>\n<p>\u8fd9\u4e2a\u7ec4\u4ef6\u5177\u6709\u4ee5\u4e0b\u529f\u80fd\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30a2\u30c8\u30df\u30c3\u30af\u306aCRUD\u64cd\u4f5c<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u9010\u6b21\u4e00\u8cab\u6027\u306e\u30b5\u30dd\u30fc\u30c8<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u539f\u5b50\u6027\/\u7dda\u5f62\u6027\u6761\u4ef6\u4e0b\u3067\u306e\u30c7\u30fc\u30bf\u5909\u66f4(Create\/Update\/Delete)<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u30ec\u30b3\u30fc\u30c9\u3054\u3068\u306b\u30e6\u30fc\u30b6\u5b9a\u7fa9\u306e\u30e1\u30bf\u30c7\u30fc\u30bf\u3092\u542b\u3081\u308b<\/ul>\n<p>\u6b64\u5916\uff0c\u6b64\u5904\u7684\u952e\u7684\u4f5c\u7528\u662f\u4e0eCassandra\u7684\u5206\u533a\u952e\u548c\u805a\u7c07\u952e\u5bf9\u5e94\uff0c\u53ef\u4ee5\u901a\u8fc7\u5217\u8868\u6216\u9017\u53f7\u5206\u9694\u7684\u5f62\u5f0f\u8fdb\u884c\u591a\u4e2a\u5b9a\u4e49\u3002<\/p>\n<p>\u6b64\u5916\uff0cScalarDB\u7684\u5b58\u50a8\u7ec4\u4ef6\u4e3aCRUD\u64cd\u4f5c\u63d0\u4f9b\u4e86\u56db\u4e2a\u51fd\u6570\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Get:1\u4ef6\u306e\u30a8\u30f3\u30c8\u30ea\u30fc\u3092\u53d6\u5f97\u3059\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Put:1\u4ef6\u306e\u30a8\u30f3\u30c8\u30ea\u30fc\u3092\u633f\u5165\/\u66f4\u65b0\u3059\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Delete:1\u4ef6\u306e\u30a8\u30f3\u30c8\u30ea\u30fc\u3092\u524a\u9664\u3059\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Scan:\u7279\u5b9a\u306e\u30d1\u30fc\u30c6\u30a3\u30b7\u30e7\u30f3\u5185\u306e\u30a8\u30f3\u30c8\u30ea\u30fc\u3092\u8907\u6570\u4ef6\u53d6\u5f97\u3059\u308b<\/ul>\n<h3>\u4ea4\u6613\u7ec4\u4ef6<\/h3>\n<p>\u8be5\u7ec4\u4ef6\u4e0d\u4ec5\u5305\u542bStorage\u7ec4\u4ef6\u7684\u529f\u80fd\uff0c\u8fd8\u63d0\u4f9b\u4e86\u65e0\u4e3b\u4e8b\u52a1\u529f\u80fd\u3002<\/p>\n<p>\u5982\u679c\u8981\u4f7f\u7528\u4e8b\u52a1\u529f\u80fd\uff0c\u9996\u5148\u9700\u8981\u83b7\u53d6TransactionService\u5b9e\u4f8b\u3002\u7136\u540e\uff0c\u5728TransactionService\u5b9e\u4f8b\u4e0a\u6267\u884cGet\u3001Put\u3001Delete\u548cScan\u64cd\u4f5c\u4e4b\u540e\uff0c\u5c06\u4e8b\u52a1\u5b9e\u4f8b\u63d0\u4ea4\u5e76\u5c06\u64cd\u4f5c\u5185\u5bb9\u53cd\u6620\u5230\u6570\u636e\u5e93\u4e2d\u3002<\/p>\n<h1>\u6837\u672c\u5e94\u7528\u7a0b\u5e8f<\/h1>\n<p>\u6211\u4eec\u5c06\u5728\u6837\u4f8b\u5e94\u7528\u7a0b\u5e8f\u4e2d\u9a8c\u8bc1ScalarDB\u7684\u5b9e\u9645\u5e94\u7528\u8fd0\u884c\u60c5\u51b5\u3002<\/p>\n<h2>\u5e94\u7528\u7a0b\u5e8f\u7684\u6982\u8ff0<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30e6\u30fc\u30b6\u3054\u3068\u306b\u53e3\u5ea7\u3092\u6301\u3064<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u53e3\u5ea7\u306b\u6307\u5b9a\u3057\u305f\u91d1\u984d\u3092\u30c1\u30e3\u30fc\u30b8<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u53e3\u5ea7\u304b\u3089\u5225\u306e\u53e3\u5ea7\u3078\u652f\u6255\u3044<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u53e3\u5ea7\u306e\u6b8b\u9ad8\u3092\u78ba\u8a8d<\/ul>\n<p>\u6211\u5011\u5c07\u5be6\u65bd\u5177\u6709\u9019\u4e9b\u529f\u80fd\u7684\u6a23\u4f8b\u61c9\u7528\u7a0b\u5f0f\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d9279913a08637a6e2bc3\/18-0.png\" alt=\"image.png\" \/><\/div>\n<h3>\u5b9a\u4e49\u6a21\u5f0f<\/h3>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d9279913a08637a6e2bc3\/20-0.png\" alt=\"image.png\" \/><\/div>\n<p>KEYSPACE: emoney<br \/>\nTABLE: account<br \/>\n\u5217\uff1a<br \/>\n&#8211; group_id: \u5206\u7ec4ID\uff08\u5206\u533a\u952e\uff09<br \/>\n&#8211; id: \u7528\u6237ID\uff08\u805a\u7c07\u952e\uff09<br \/>\n&#8211; balance: \u7528\u6237\u7684\u4f59\u989d<\/p>\n<h3>\u5904\u7406\u7684\u6b65\u9aa4<\/h3>\n<h4>\u5145\u7535<\/h4>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u83b7\u53d6\u6307\u5b9a\u7528\u6237\u7684\u4fe1\u606f<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u5728\u83b7\u53d6\u7684\u7528\u6237\u4fe1\u606f\u4e2d\u6dfb\u52a0\u5145\u503c\u91d1\u989d<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\u5c06\u66f4\u65b0\u540e\u7684\u4fe1\u606f\u5199\u5165<\/ol>\n<p>\u5728\u4e00\u4e2a\u4e8b\u52a1\u5185\u6267\u884c\u4e0a\u8ff0\u4e00\u7cfb\u5217\u64cd\u4f5c\u3002<\/p>\n<h4>\u4ed8\u6b3e<\/h4>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u83b7\u53d6\u53d1\u9001\u4eba\u548c\u63a5\u6536\u4eba\u7684\u91d1\u94b1\u4fe1\u606f<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u786e\u8ba4\u53d1\u9001\u4eba\u7684\u4f59\u989d\u5927\u4e8e\u53d1\u9001\u91d1\u989d<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u5c06\u53d1\u9001\u91d1\u989d\u4ece\u53d1\u9001\u4eba\u51cf\u5c11\uff0c\u5c06\u53d1\u9001\u91d1\u989d\u589e\u52a0\u5230\u63a5\u6536\u4eba<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\u5c06\u66f4\u65b0\u7684\u4fe1\u606f\u5199\u5165<\/ol>\n<p>\u5728\u4e00\u4e2a\u4e8b\u52a1\u4e2d\u6267\u884c\u4ee5\u4e0a\u7684\u4e00\u7cfb\u5217\u52a8\u4f5c\u3002<\/p>\n<h4>\u67e5\u8be2\u8d26\u6237\u4f59\u989d<\/h4>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u83b7\u53d6\u6240\u6709\u7528\u6237\u4fe1\u606f<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u4f7f\u7528\u5faa\u73af\u5904\u7406\u9010\u4e2a\u63d0\u53d6\u7528\u6237\u4fe1\u606f<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\u4ece\u7528\u6237\u4fe1\u606f\u4e2d\u83b7\u53d6\u4f59\u989d\uff0c\u5e76\u663e\u793a\u5728\u63a7\u5236\u53f0\u4e0a<\/ol>\n<h2>\u5efa\u7acb\u73af\u5883<\/h2>\n<p>\u5047\u8bbe\u5df2\u7ecf\u5b89\u88c5\u4e86\u6267\u884c\u6240\u9700\u64cd\u4f5c\u7684\u5e94\u7528\u7a0b\u5e8f\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528Gradle\u6765\u83b7\u53d6\u8fd0\u884c\u7528\u7684jar\u6587\u4ef6\u3002<\/p>\n<p>\u8bbe\u5b9aScalar DB\u6a21\u5f0f\u5de5\u5177\u7684\u8def\u5f84\u3002<\/p>\n<p>\u5728.bash_profile\u4e2d\u6dfb\u52a0\u5230Schema Tools\u7684\u8def\u5f84\u8bbe\u7f6e<br \/>\nexport SCHEMATOOL=\/home\/(\u81ea\u5df1\u73af\u5883\u7684\u7528\u6237\u540d)\/scalardb\/tools\/schema<\/p>\n<p>\u5c06\u8bbe\u7f6e\u66f4\u6539\u751f\u6548\u3002\u793a\u4f8b\uff1a$ source ~\/.bash_profile<\/p>\n<p>2. \u8bbe\u5b9a\u6837\u672c\u9879\u76ee\u76ee\u5f55\u914d\u7f6e<\/p>\n<p>\u521b\u5efa\u5e76\u79fb\u52a8\u5230\u76ee\u5f55<br \/>\n$ mkdir ~\/scalardb_sample<br \/>\n$ cd ~\/scalardb_sample<\/p>\n<p>\u6267\u884cgradle\u521d\u59cb\u5316\u547d\u4ee4<br \/>\n$ gradle init &#8211;type java-application<\/p>\n<p>\u521b\u5efaGradle\u5b9a\u4e49\u6587\u4ef6<br \/>\n$ \u4f7f\u7528vi\u547d\u4ee4\u6253\u5f00build.gradle\u6587\u4ef6<\/p>\n<pre class=\"post-pre\"><code><span class=\"err\">#<\/span> <span class=\"n\">mainClassName<\/span><span class=\"err\">\u306e\u6307\u5b9a\u3092\u5909\u66f4<\/span><span class=\"o\">(<\/span><span class=\"mi\">18<\/span><span class=\"err\">\u884c\u76ee<\/span><span class=\"o\">)<\/span>\r\n<span class=\"err\">#<\/span> <span class=\"err\">\u5909\u66f4\u524d<\/span>\r\n<span class=\"n\">mainClassName<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">'App'<\/span>\r\n<span class=\"err\">#<\/span> <span class=\"err\">\u5909\u66f4\u5f8c<\/span>\r\n<span class=\"n\">mainClassName<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">'sample.emoney.ElectronicMoneyMain'<\/span>\r\n<span class=\"err\">#<\/span> <span class=\"k\">dependencies<\/span><span class=\"err\">\u306b<\/span><span class=\"n\">Scalar<\/span> <span class=\"n\">DB<\/span><span class=\"err\">\u5b9a\u7fa9\u3092\u8ffd\u52a0<\/span><span class=\"o\">(<\/span><span class=\"mi\">22<\/span><span class=\"err\">\u884c\u76ee<\/span><span class=\"o\">)<\/span>\r\n<span class=\"k\">dependencies<\/span> <span class=\"o\">{<\/span>\r\n<span class=\"c1\">\/\/ This dependency is found on compile classpath of this component and consumers.<\/span>\r\n<span class=\"n\">compile<\/span> <span class=\"s1\">'com.google.guava:guava:23.0'<\/span>\r\n<span class=\"n\">compile<\/span> <span class=\"nl\">group:<\/span> <span class=\"s1\">'com.scalar-labs'<\/span><span class=\"o\">,<\/span> <span class=\"nl\">name:<\/span> <span class=\"s1\">'scalardb'<\/span><span class=\"o\">,<\/span> <span class=\"nl\">version:<\/span> <span class=\"s1\">'1.0.0'<\/span>\r\n<span class=\"c1\">\/\/ Use JUnit test framework<\/span>\r\n<span class=\"n\">testCompile<\/span> <span class=\"s1\">'junit:junit:4.12'<\/span>\r\n<\/code><\/pre>\n<p>\u901a\u8fc7gradle\u6784\u5efa\u83b7\u53d6\u53ef\u6267\u884c\u7684jar\u6587\u4ef6\u3002<\/p>\n<p>\u5982\u679c\u663e\u793a\u201c\u6784\u5efa\u6210\u529f\u201d\uff0c\u90a3\u5c31\u8868\u793aOK\u3002<\/p>\n<h2>\u5b8c\u6210<\/h2>\n<p>1. \u521b\u5efa\u6a21\u5f0f\u6587\u4ef6<br \/>\n$ vi emoney.sdbql<\/p>\n<pre class=\"post-pre\"><code>REPLICATION FACTOR 1;\r\nCREATE NAMESPACE emoney;\r\nCREATE TRANSACTION TABLE emoney.account (\r\n group_id TEXT PARTITIONKEY,\r\n id TEXT CLUSTERINGKEY,\r\n balance INT,\r\n);\r\n<\/code><\/pre>\n<p>\u4f7f\u7528Schema Tool\uff0c\u5728Cassandra\u4e2d\u521b\u5efa\u6a21\u5f0f\u3002<br \/>\n$SCHEMATOOL\/loader emoney.sdbql<\/p>\n<p>\u4f7f\u7528cqlsh\u5de5\u5177\u6765\u786e\u8ba4\u6570\u636e\u5e93\u7684\u67b6\u6784<\/p>\n<p>cqlsh&gt; \u67e5\u770b\u6240\u6709keyspace\uff0c\u786e\u8ba4\u5b58\u5728emoney<\/p>\n<pre class=\"post-pre\"><code>emoney system_auth coordinator system_traces\r\nsystem_schema system system_distributed\r\n<\/code><\/pre>\n<p>\u786e\u8ba4\u8868\u4e2d\u5b58\u5728account<br \/>\ncqlsh&gt; \u4f7f\u7528emoney\u6570\u636e\u5e93;<br \/>\ncqlsh:emoney&gt; \u67e5\u770b\u6240\u6709\u8868;<\/p>\n<pre class=\"post-pre\"><code>account\r\n<\/code><\/pre>\n<p>\u7ed3\u675fcqlsh\u3002<br \/>\ncqlsh\uff1aemoney&gt; \u9000\u51fa<\/p>\n<p>\u6211\u4eec\u5c06\u521b\u5efa\u4e24\u4e2a\u6587\u4ef6\uff1a\u4e00\u4e2a\u5305\u542b\u6784\u9020\u51fd\u6570\u548c\u51fd\u6570\u7684\u7c7b\u6587\u4ef6\uff0c\u53e6\u4e00\u4e2a\u662f\u7528\u4e8e\u63a5\u6536\u53c2\u6570\u5e76\u8c03\u7528\u51fd\u6570\u7684\u6267\u884c\u7c7b\u6587\u4ef6\u3002<\/p>\n<p>\u521b\u5efa\u76ee\u5f55\u548cJava\u6587\u4ef6<br \/>\n$ mkdir -p src\/main\/java\/sample\/emoney<br \/>\n$ cd src\/main\/java\/sample\/emoney<br \/>\n$ vi ElectronicMoney.java<\/p>\n<p>\u521b\u5efa\u6587\u4ef6\u5939\u548cJava\u6587\u4ef6<br \/>\n$ mkdir -p src\/main\/java\/sample\/emoney<br \/>\n$ cd src\/main\/java\/sample\/emoney<br \/>\n$ vi ElectronicMoney.java<\/p>\n<p>\u5efa\u7acb\u76ee\u5f55\u548cJava\u6587\u4ef6<br \/>\n$ mkdir -p src\/main\/java\/sample\/emoney<br \/>\n$ cd src\/main\/java\/sample\/emoney<br \/>\n$ vi ElectronicMoney.java<\/p>\n<pre class=\"post-pre\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">sample.emoney<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"c1\">\/\/\u30a4\u30f3\u30dd\u30fc\u30c8\u8ffd\u52a0 <\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.google.inject.Guice<\/span><span class=\"o\">;<\/span> \r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.google.inject.Injector<\/span><span class=\"o\">;<\/span> \r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.scalar.database.config.DatabaseConfig<\/span><span class=\"o\">;<\/span> \r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.scalar.database.service.StorageModule<\/span><span class=\"o\">;<\/span> \r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.scalar.database.service.StorageService<\/span><span class=\"o\">;<\/span> \r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.scalar.database.service.TransactionModule<\/span><span class=\"o\">;<\/span> \r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.scalar.database.service.TransactionService<\/span><span class=\"o\">;<\/span> \r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.io.File<\/span><span class=\"o\">;<\/span> \r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.io.IOException<\/span><span class=\"o\">;<\/span> \r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.scalar.database.api.DistributedTransaction<\/span><span class=\"o\">;<\/span> \r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.scalar.database.api.Get<\/span><span class=\"o\">;<\/span> \r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.scalar.database.api.Put<\/span><span class=\"o\">;<\/span> \r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.scalar.database.api.Delete<\/span><span class=\"o\">;<\/span> \r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.scalar.database.api.Result<\/span><span class=\"o\">;<\/span> \r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.scalar.database.io.IntValue<\/span><span class=\"o\">;<\/span> \r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.scalar.database.io.Key<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.scalar.database.io.TextValue<\/span><span class=\"o\">;<\/span> \r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.scalar.database.exception.storage.ExecutionException<\/span><span class=\"o\">;<\/span> \r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.scalar.database.exception.transaction.CommitException<\/span><span class=\"o\">;<\/span> \r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.scalar.database.exception.transaction.CrudException<\/span><span class=\"o\">;<\/span> \r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.scalar.database.exception.transaction.UnknownTransactionStatusException<\/span><span class=\"o\">;<\/span> \r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.Optional<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.scalar.database.api.Scan<\/span><span class=\"o\">;<\/span> \r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.scalar.database.api.Scanner<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">ElectronicMoney<\/span> <span class=\"o\">{<\/span>\r\n  <span class=\"c1\">\/\/ \u30af\u30e9\u30b9\u5909\u6570\u3092\u5b9a\u7fa9<\/span>\r\n  <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">String<\/span> <span class=\"no\">NAMESPACE<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"emoney\"<\/span><span class=\"o\">;<\/span>\r\n  <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">String<\/span> <span class=\"no\">TABLE_NAME<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"account\"<\/span><span class=\"o\">;<\/span>\r\n  <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">String<\/span> <span class=\"no\">ID<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"id\"<\/span><span class=\"o\">;<\/span>\r\n  <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">String<\/span> <span class=\"no\">GROUP_ID<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"group_id\"<\/span><span class=\"o\">;<\/span>\r\n  <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">String<\/span> <span class=\"no\">BALANCE<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"balance\"<\/span><span class=\"o\">;<\/span>\r\n  <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">StorageService<\/span> <span class=\"n\">storageService<\/span><span class=\"o\">;<\/span>\r\n  <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">TransactionService<\/span> <span class=\"n\">transactionService<\/span><span class=\"o\">;<\/span>\r\n\r\n  <span class=\"c1\">\/\/ \u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u3092\u5b9f\u88c5<\/span>\r\n  <span class=\"kd\">public<\/span> <span class=\"nf\">ElectronicMoney<\/span><span class=\"o\">()<\/span> <span class=\"kd\">throws<\/span> <span class=\"nc\">IOException<\/span> <span class=\"o\">{<\/span>\r\n   <span class=\"nc\">File<\/span> <span class=\"n\">prop_file<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">File<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/etc\/scalar\/database.properties\"<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"nc\">DatabaseConfig<\/span> <span class=\"n\">config<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">DatabaseConfig<\/span><span class=\"o\">(<\/span><span class=\"n\">prop_file<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"nc\">Injector<\/span> <span class=\"n\">injector<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">Guice<\/span><span class=\"o\">.<\/span><span class=\"na\">createInjector<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">StorageModule<\/span><span class=\"o\">(<\/span><span class=\"n\">config<\/span><span class=\"o\">));<\/span>\r\n   <span class=\"n\">storageService<\/span> <span class=\"o\">=<\/span> <span class=\"n\">injector<\/span><span class=\"o\">.<\/span><span class=\"na\">getInstance<\/span><span class=\"o\">(<\/span><span class=\"nc\">StorageService<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"n\">storageService<\/span><span class=\"o\">.<\/span><span class=\"na\">with<\/span><span class=\"o\">(<\/span><span class=\"no\">NAMESPACE<\/span><span class=\"o\">,<\/span> <span class=\"no\">TABLE_NAME<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"n\">injector<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">Guice<\/span><span class=\"o\">.<\/span><span class=\"na\">createInjector<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">TransactionModule<\/span><span class=\"o\">(<\/span><span class=\"n\">config<\/span><span class=\"o\">));<\/span>\r\n   <span class=\"n\">transactionService<\/span> <span class=\"o\">=<\/span> <span class=\"n\">injector<\/span><span class=\"o\">.<\/span><span class=\"na\">getInstance<\/span><span class=\"o\">(<\/span><span class=\"nc\">TransactionService<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"n\">transactionService<\/span><span class=\"o\">.<\/span><span class=\"na\">with<\/span><span class=\"o\">(<\/span><span class=\"no\">NAMESPACE<\/span><span class=\"o\">,<\/span> <span class=\"no\">TABLE_NAME<\/span><span class=\"o\">);<\/span>\r\n  <span class=\"o\">}<\/span>\r\n\r\n  <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">charge<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span> <span class=\"n\">groupId<\/span><span class=\"o\">,<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">id<\/span><span class=\"o\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">amount<\/span><span class=\"o\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"nc\">CrudException<\/span><span class=\"o\">,<\/span> <span class=\"nc\">CommitException<\/span><span class=\"o\">,<\/span> <span class=\"nc\">UnknownTransact<\/span> <span class=\"n\">ionStatusException<\/span> <span class=\"o\">{<\/span>\r\n   <span class=\"c1\">\/\/\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u958b\u59cb<\/span>\r\n   <span class=\"nc\">DistributedTransaction<\/span> <span class=\"n\">tx<\/span> <span class=\"o\">=<\/span> <span class=\"n\">transactionService<\/span><span class=\"o\">.<\/span><span class=\"na\">start<\/span><span class=\"o\">();<\/span>\r\n   <span class=\"nc\">Key<\/span> <span class=\"n\">partitionKey<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Key<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">TextValue<\/span><span class=\"o\">(<\/span><span class=\"no\">GROUP_ID<\/span><span class=\"o\">,<\/span> <span class=\"n\">groupId<\/span><span class=\"o\">));<\/span>\r\n   <span class=\"nc\">Key<\/span> <span class=\"n\">clusteringKey<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Key<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">TextValue<\/span><span class=\"o\">(<\/span><span class=\"no\">ID<\/span><span class=\"o\">,<\/span> <span class=\"n\">id<\/span><span class=\"o\">));<\/span>\r\n   <span class=\"nc\">Get<\/span> <span class=\"n\">get<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Get<\/span><span class=\"o\">(<\/span><span class=\"n\">partitionKey<\/span><span class=\"o\">,<\/span> <span class=\"n\">clusteringKey<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"nc\">Optional<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">Result<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">result<\/span> <span class=\"o\">=<\/span> <span class=\"n\">tx<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">(<\/span><span class=\"n\">get<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"kt\">int<\/span> <span class=\"n\">balance<\/span> <span class=\"o\">=<\/span> <span class=\"n\">amount<\/span><span class=\"o\">;<\/span>\r\n\r\n   <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">result<\/span><span class=\"o\">.<\/span><span class=\"na\">isPresent<\/span><span class=\"o\">())<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"kt\">int<\/span> <span class=\"n\">current<\/span> <span class=\"o\">=<\/span> <span class=\"o\">((<\/span><span class=\"nc\">IntValue<\/span><span class=\"o\">)<\/span> <span class=\"n\">result<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">().<\/span><span class=\"na\">getValue<\/span><span class=\"o\">(<\/span><span class=\"no\">BALANCE<\/span><span class=\"o\">).<\/span><span class=\"na\">get<\/span><span class=\"o\">()).<\/span><span class=\"na\">get<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"n\">balance<\/span> <span class=\"o\">+=<\/span> <span class=\"n\">current<\/span><span class=\"o\">;<\/span>\r\n   <span class=\"o\">}<\/span>\r\n\r\n   <span class=\"c1\">\/\/ \u6b8b\u9ad8\u3092\u66f4\u65b0<\/span>\r\n   <span class=\"nc\">Put<\/span> <span class=\"n\">put<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Put<\/span><span class=\"o\">(<\/span><span class=\"n\">partitionKey<\/span><span class=\"o\">,<\/span> <span class=\"n\">clusteringKey<\/span><span class=\"o\">).<\/span><span class=\"na\">withValue<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">IntValue<\/span><span class=\"o\">(<\/span><span class=\"no\">BALANCE<\/span><span class=\"o\">,<\/span> <span class=\"n\">balance<\/span><span class=\"o\">));<\/span>\r\n   <span class=\"n\">tx<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"n\">put<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"c1\">\/\/ \u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u30b3\u30df\u30c3\u30c8<\/span>\r\n   <span class=\"n\">tx<\/span><span class=\"o\">.<\/span><span class=\"na\">commit<\/span><span class=\"o\">();<\/span>\r\n  <span class=\"o\">}<\/span>\r\n\r\n  <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">pay<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span> <span class=\"n\">groupId<\/span><span class=\"o\">,<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">fromId<\/span><span class=\"o\">,<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">toId<\/span><span class=\"o\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">amount<\/span><span class=\"o\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"nc\">CrudException<\/span><span class=\"o\">,<\/span>   <span class=\"nc\">CommitException<\/span><span class=\"o\">,<\/span> <span class=\"nc\">UnknownTransactionStatusException<\/span> <span class=\"o\">{<\/span>\r\n   <span class=\"c1\">\/\/ \u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u958b\u59cb<\/span>\r\n   <span class=\"nc\">DistributedTransaction<\/span> <span class=\"n\">tx<\/span> <span class=\"o\">=<\/span> <span class=\"n\">transactionService<\/span><span class=\"o\">.<\/span><span class=\"na\">start<\/span><span class=\"o\">();<\/span>\r\n   <span class=\"c1\">\/\/ \u9001\u91d1\u5143\u3001\u9001\u91d1\u5148\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u60c5\u5831\u3092\u53d6\u5f97<\/span>\r\n   <span class=\"nc\">Key<\/span> <span class=\"n\">partitionKey<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Key<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">TextValue<\/span><span class=\"o\">(<\/span><span class=\"no\">GROUP_ID<\/span><span class=\"o\">,<\/span> <span class=\"n\">groupId<\/span><span class=\"o\">));<\/span>\r\n   <span class=\"nc\">Key<\/span> <span class=\"n\">fromKey<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Key<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">TextValue<\/span><span class=\"o\">(<\/span><span class=\"no\">ID<\/span><span class=\"o\">,<\/span> <span class=\"n\">fromId<\/span><span class=\"o\">));<\/span>\r\n   <span class=\"nc\">Key<\/span> <span class=\"n\">toKey<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Key<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">TextValue<\/span><span class=\"o\">(<\/span><span class=\"no\">ID<\/span><span class=\"o\">,<\/span> <span class=\"n\">toId<\/span><span class=\"o\">));<\/span>\r\n   <span class=\"nc\">Get<\/span> <span class=\"n\">fromGet<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Get<\/span><span class=\"o\">(<\/span><span class=\"n\">partitionKey<\/span><span class=\"o\">,<\/span> <span class=\"n\">fromKey<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"nc\">Get<\/span> <span class=\"n\">toGet<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Get<\/span><span class=\"o\">(<\/span><span class=\"n\">partitionKey<\/span><span class=\"o\">,<\/span> <span class=\"n\">toKey<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"nc\">Optional<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">Result<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">fromResult<\/span> <span class=\"o\">=<\/span> <span class=\"n\">tx<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">(<\/span><span class=\"n\">fromGet<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"nc\">Optional<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">Result<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">toResult<\/span> <span class=\"o\">=<\/span> <span class=\"n\">tx<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">(<\/span><span class=\"n\">toGet<\/span><span class=\"o\">);<\/span>\r\n\r\n   <span class=\"k\">if<\/span> <span class=\"o\">(!<\/span><span class=\"n\">fromResult<\/span><span class=\"o\">.<\/span><span class=\"na\">isPresent<\/span><span class=\"o\">())<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">RuntimeException<\/span><span class=\"o\">(<\/span><span class=\"n\">fromId<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" doesn't exist.\"<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"o\">}<\/span>\r\n   <span class=\"k\">if<\/span> <span class=\"o\">(!<\/span><span class=\"n\">toResult<\/span><span class=\"o\">.<\/span><span class=\"na\">isPresent<\/span><span class=\"o\">())<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">RuntimeException<\/span><span class=\"o\">(<\/span><span class=\"n\">toId<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" doesn't exist.\"<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"o\">}<\/span>\r\n   <span class=\"kt\">int<\/span> <span class=\"n\">newFromBalance<\/span> <span class=\"o\">=<\/span> <span class=\"o\">((<\/span><span class=\"nc\">IntValue<\/span><span class=\"o\">)<\/span> <span class=\"o\">(<\/span><span class=\"n\">fromResult<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">().<\/span><span class=\"na\">getValue<\/span><span class=\"o\">(<\/span><span class=\"no\">BALANCE<\/span><span class=\"o\">).<\/span><span class=\"na\">get<\/span><span class=\"o\">())).<\/span><span class=\"na\">get<\/span><span class=\"o\">()<\/span> <span class=\"o\">-<\/span> <span class=\"n\">amount<\/span><span class=\"o\">;<\/span>\r\n   <span class=\"kt\">int<\/span> <span class=\"n\">newToBalance<\/span> <span class=\"o\">=<\/span> <span class=\"o\">((<\/span><span class=\"nc\">IntValue<\/span><span class=\"o\">)<\/span> <span class=\"o\">(<\/span><span class=\"n\">toResult<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">().<\/span><span class=\"na\">getValue<\/span><span class=\"o\">(<\/span><span class=\"no\">BALANCE<\/span><span class=\"o\">).<\/span><span class=\"na\">get<\/span><span class=\"o\">())).<\/span><span class=\"na\">get<\/span><span class=\"o\">()<\/span> <span class=\"o\">+<\/span> <span class=\"n\">amount<\/span><span class=\"o\">;<\/span>\r\n   <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">newFromBalance<\/span> <span class=\"o\">&lt;<\/span> <span class=\"mi\">0<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">RuntimeException<\/span><span class=\"o\">(<\/span><span class=\"n\">fromId<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" doesn't have enough balances.\"<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"o\">}<\/span>\r\n\r\n   <span class=\"c1\">\/\/ \u6b8b\u9ad8\u3092\u66f4\u65b0<\/span>\r\n   <span class=\"nc\">Put<\/span> <span class=\"n\">fromPut<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Put<\/span><span class=\"o\">(<\/span><span class=\"n\">partitionKey<\/span><span class=\"o\">,<\/span> <span class=\"n\">fromKey<\/span><span class=\"o\">).<\/span><span class=\"na\">withValue<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">IntValue<\/span><span class=\"o\">(<\/span><span class=\"no\">BALANCE<\/span><span class=\"o\">,<\/span> <span class=\"n\">newFromBalance<\/span><span class=\"o\">));<\/span>\r\n   <span class=\"nc\">Put<\/span> <span class=\"n\">toPut<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Put<\/span><span class=\"o\">(<\/span><span class=\"n\">partitionKey<\/span><span class=\"o\">,<\/span> <span class=\"n\">toKey<\/span><span class=\"o\">).<\/span><span class=\"na\">withValue<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">IntValue<\/span><span class=\"o\">(<\/span><span class=\"no\">BALANCE<\/span><span class=\"o\">,<\/span> <span class=\"n\">newToBalance<\/span><span class=\"o\">));<\/span>\r\n   <span class=\"n\">tx<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"n\">fromPut<\/span><span class=\"o\">);<\/span>   <span class=\"n\">tx<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"n\">toPut<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"c1\">\/\/ \u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u30b3\u30df\u30c3\u30c8<\/span>\r\n   <span class=\"n\">tx<\/span><span class=\"o\">.<\/span><span class=\"na\">commit<\/span><span class=\"o\">();<\/span>\r\n  <span class=\"o\">}<\/span>\r\n\r\n  <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">balances<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span> <span class=\"n\">groupId<\/span><span class=\"o\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"nc\">ExecutionException<\/span> <span class=\"o\">{<\/span>\r\n   <span class=\"nc\">Key<\/span> <span class=\"n\">partitionKey<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Key<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">TextValue<\/span><span class=\"o\">(<\/span><span class=\"no\">GROUP_ID<\/span><span class=\"o\">,<\/span> <span class=\"n\">groupId<\/span><span class=\"o\">));<\/span>\r\n   <span class=\"nc\">Scan<\/span> <span class=\"n\">scan<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Scan<\/span><span class=\"o\">(<\/span><span class=\"n\">partitionKey<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"nc\">Scanner<\/span> <span class=\"n\">scanner<\/span> <span class=\"o\">=<\/span> <span class=\"n\">storageService<\/span><span class=\"o\">.<\/span><span class=\"na\">scan<\/span><span class=\"o\">(<\/span><span class=\"n\">scan<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"n\">scanner<\/span><span class=\"o\">.<\/span><span class=\"na\">forEach<\/span><span class=\"o\">(<\/span><span class=\"n\">r<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"n\">r<\/span><span class=\"o\">.<\/span><span class=\"na\">getValue<\/span><span class=\"o\">(<\/span><span class=\"no\">ID<\/span><span class=\"o\">).<\/span><span class=\"na\">ifPresent<\/span><span class=\"o\">(<\/span><span class=\"n\">v<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"nc\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">print<\/span><span class=\"o\">(((<\/span><span class=\"nc\">TextValue<\/span><span class=\"o\">)<\/span> <span class=\"n\">v<\/span><span class=\"o\">).<\/span><span class=\"na\">getString<\/span><span class=\"o\">().<\/span><span class=\"na\">get<\/span><span class=\"o\">()));<\/span>\r\n    <span class=\"nc\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">print<\/span><span class=\"o\">(<\/span><span class=\"s\">\" : \"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">r<\/span><span class=\"o\">.<\/span><span class=\"na\">getValue<\/span><span class=\"o\">(<\/span><span class=\"no\">BALANCE<\/span><span class=\"o\">).<\/span><span class=\"na\">ifPresent<\/span><span class=\"o\">(<\/span><span class=\"n\">v<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"nc\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(((<\/span><span class=\"nc\">IntValue<\/span><span class=\"o\">)<\/span> <span class=\"n\">v<\/span><span class=\"o\">).<\/span><span class=\"na\">get<\/span><span class=\"o\">()));<\/span>\r\n   <span class=\"o\">});<\/span>\r\n  <span class=\"o\">}<\/span>\r\n\r\n  <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">deleteUser<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span> <span class=\"n\">groupId<\/span><span class=\"o\">,<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">id<\/span><span class=\"o\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"nc\">CrudException<\/span><span class=\"o\">,<\/span> <span class=\"nc\">CommitException<\/span><span class=\"o\">,<\/span> <span class=\"nc\">UnknownTransactionStatu<\/span> <span class=\"n\">sException<\/span> <span class=\"o\">{<\/span>\r\n   <span class=\"c1\">\/\/ \u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u958b\u59cb<\/span>\r\n   <span class=\"nc\">DistributedTransaction<\/span> <span class=\"n\">tx<\/span> <span class=\"o\">=<\/span> <span class=\"n\">transactionService<\/span><span class=\"o\">.<\/span><span class=\"na\">start<\/span><span class=\"o\">();<\/span>\r\n   <span class=\"nc\">Key<\/span> <span class=\"n\">partitionKey<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Key<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">TextValue<\/span><span class=\"o\">(<\/span><span class=\"no\">GROUP_ID<\/span><span class=\"o\">,<\/span> <span class=\"n\">groupId<\/span><span class=\"o\">));<\/span>\r\n   <span class=\"nc\">Key<\/span> <span class=\"n\">clusteringKey<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Key<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">TextValue<\/span><span class=\"o\">(<\/span><span class=\"no\">ID<\/span><span class=\"o\">,<\/span> <span class=\"n\">id<\/span><span class=\"o\">));<\/span>\r\n   <span class=\"nc\">Get<\/span> <span class=\"n\">get<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Get<\/span><span class=\"o\">(<\/span><span class=\"n\">partitionKey<\/span><span class=\"o\">,<\/span> <span class=\"n\">clusteringKey<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"nc\">Optional<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">Result<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">result<\/span> <span class=\"o\">=<\/span> <span class=\"n\">tx<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">(<\/span><span class=\"n\">get<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"k\">if<\/span> <span class=\"o\">(!<\/span><span class=\"n\">result<\/span><span class=\"o\">.<\/span><span class=\"na\">isPresent<\/span><span class=\"o\">())<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"n\">tx<\/span><span class=\"o\">.<\/span><span class=\"na\">abort<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"k\">return<\/span><span class=\"o\">;<\/span>\r\n   <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"c1\">\/\/ \u6b8b\u9ad8\u3092\u66f4\u65b0<\/span>\r\n   <span class=\"nc\">Delete<\/span> <span class=\"n\">delete<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Delete<\/span><span class=\"o\">(<\/span><span class=\"n\">partitionKey<\/span><span class=\"o\">,<\/span> <span class=\"n\">clusteringKey<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"n\">tx<\/span><span class=\"o\">.<\/span><span class=\"na\">delete<\/span><span class=\"o\">(<\/span><span class=\"n\">delete<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"c1\">\/\/ \u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u30b3\u30df\u30c3\u30c8<\/span>\r\n   <span class=\"n\">tx<\/span><span class=\"o\">.<\/span><span class=\"na\">commit<\/span><span class=\"o\">();<\/span>\r\n  <span class=\"o\">}<\/span>\r\n\r\n  <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">close<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n   <span class=\"n\">storageService<\/span><span class=\"o\">.<\/span><span class=\"na\">close<\/span><span class=\"o\">();<\/span>\r\n   <span class=\"n\">transactionService<\/span><span class=\"o\">.<\/span><span class=\"na\">close<\/span><span class=\"o\">();<\/span>\r\n  <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n\r\n<\/code><\/pre>\n<p>\u4f7f\u7528vi\u7f16\u8f91\u5668\u6253\u5f00ElectronicMoneyMain.java\u6587\u4ef6<\/p>\n<pre class=\"post-pre\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">sample.emoney<\/span><span class=\"o\">;<\/span> \r\n\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">ElectronicMoneyMain<\/span> <span class=\"o\">{<\/span>\r\n <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">args<\/span><span class=\"o\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"nc\">Exception<\/span> <span class=\"o\">{<\/span>\r\n  <span class=\"nc\">String<\/span> <span class=\"n\">action<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"o\">;<\/span>\r\n  <span class=\"kt\">int<\/span> <span class=\"n\">amount<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"o\">;<\/span>\r\n  <span class=\"nc\">String<\/span> <span class=\"n\">group<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"o\">;<\/span>\r\n  <span class=\"nc\">String<\/span> <span class=\"n\">to<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"o\">;<\/span>\r\n  <span class=\"nc\">String<\/span> <span class=\"n\">from<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"o\">;<\/span>\r\n\r\n  <span class=\"k\">for<\/span> <span class=\"o\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">i<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"o\">;<\/span> <span class=\"n\">i<\/span> <span class=\"o\">&lt;<\/span> <span class=\"n\">args<\/span><span class=\"o\">.<\/span><span class=\"na\">length<\/span><span class=\"o\">;<\/span> <span class=\"o\">++<\/span><span class=\"n\">i<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n   <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"s\">\"-action\"<\/span><span class=\"o\">.<\/span><span class=\"na\">equals<\/span><span class=\"o\">(<\/span><span class=\"n\">args<\/span><span class=\"o\">[<\/span><span class=\"n\">i<\/span><span class=\"o\">]))<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"n\">action<\/span> <span class=\"o\">=<\/span> <span class=\"n\">args<\/span><span class=\"o\">[++<\/span><span class=\"n\">i<\/span><span class=\"o\">];<\/span>\r\n   <span class=\"o\">}<\/span> <span class=\"k\">else<\/span> <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"s\">\"-group\"<\/span><span class=\"o\">.<\/span><span class=\"na\">equals<\/span><span class=\"o\">(<\/span><span class=\"n\">args<\/span><span class=\"o\">[<\/span><span class=\"n\">i<\/span><span class=\"o\">]))<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"n\">group<\/span> <span class=\"o\">=<\/span> <span class=\"n\">args<\/span><span class=\"o\">[++<\/span><span class=\"n\">i<\/span><span class=\"o\">];<\/span>\r\n   <span class=\"o\">}<\/span> <span class=\"k\">else<\/span> <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"s\">\"-amount\"<\/span><span class=\"o\">.<\/span><span class=\"na\">equals<\/span><span class=\"o\">(<\/span><span class=\"n\">args<\/span><span class=\"o\">[<\/span><span class=\"n\">i<\/span><span class=\"o\">]))<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"n\">amount<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">Integer<\/span><span class=\"o\">.<\/span><span class=\"na\">parseInt<\/span><span class=\"o\">(<\/span><span class=\"n\">args<\/span><span class=\"o\">[++<\/span><span class=\"n\">i<\/span><span class=\"o\">]);<\/span>\r\n   <span class=\"o\">}<\/span> <span class=\"k\">else<\/span> <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"s\">\"-to\"<\/span><span class=\"o\">.<\/span><span class=\"na\">equals<\/span><span class=\"o\">(<\/span><span class=\"n\">args<\/span><span class=\"o\">[<\/span><span class=\"n\">i<\/span><span class=\"o\">]))<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"n\">to<\/span> <span class=\"o\">=<\/span> <span class=\"n\">args<\/span><span class=\"o\">[++<\/span><span class=\"n\">i<\/span><span class=\"o\">];<\/span>\r\n   <span class=\"o\">}<\/span> <span class=\"k\">else<\/span> <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"s\">\"-from\"<\/span><span class=\"o\">.<\/span><span class=\"na\">equals<\/span><span class=\"o\">(<\/span><span class=\"n\">args<\/span><span class=\"o\">[<\/span><span class=\"n\">i<\/span><span class=\"o\">]))<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"n\">from<\/span> <span class=\"o\">=<\/span> <span class=\"n\">args<\/span><span class=\"o\">[++<\/span><span class=\"n\">i<\/span><span class=\"o\">];<\/span>\r\n   <span class=\"o\">}<\/span> <span class=\"k\">else<\/span> <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"s\">\"-help\"<\/span><span class=\"o\">.<\/span><span class=\"na\">equals<\/span><span class=\"o\">(<\/span><span class=\"n\">args<\/span><span class=\"o\">[<\/span><span class=\"n\">i<\/span><span class=\"o\">]))<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"n\">printUsageAndExit<\/span><span class=\"o\">();<\/span>\r\n   <span class=\"o\">}<\/span>\r\n  <span class=\"o\">}<\/span>\r\n\r\n <span class=\"nc\">ElectronicMoney<\/span> <span class=\"n\">eMoney<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">ElectronicMoney<\/span><span class=\"o\">();<\/span>\r\n <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">action<\/span><span class=\"o\">.<\/span><span class=\"na\">equalsIgnoreCase<\/span><span class=\"o\">(<\/span><span class=\"s\">\"charge\"<\/span><span class=\"o\">))<\/span> <span class=\"o\">{<\/span>\r\n   <span class=\"n\">eMoney<\/span><span class=\"o\">.<\/span><span class=\"na\">charge<\/span><span class=\"o\">(<\/span><span class=\"n\">group<\/span><span class=\"o\">,<\/span> <span class=\"n\">to<\/span><span class=\"o\">,<\/span> <span class=\"n\">amount<\/span><span class=\"o\">);<\/span>\r\n  <span class=\"o\">}<\/span> <span class=\"k\">else<\/span> <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">action<\/span><span class=\"o\">.<\/span><span class=\"na\">equalsIgnoreCase<\/span><span class=\"o\">(<\/span><span class=\"s\">\"pay\"<\/span><span class=\"o\">))<\/span> <span class=\"o\">{<\/span>\r\n   <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">from<\/span> <span class=\"o\">==<\/span> <span class=\"kc\">null<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n   <span class=\"n\">printUsageAndExit<\/span><span class=\"o\">();<\/span>\r\n   <span class=\"o\">}<\/span>\r\n   <span class=\"n\">eMoney<\/span><span class=\"o\">.<\/span><span class=\"na\">pay<\/span><span class=\"o\">(<\/span><span class=\"n\">group<\/span><span class=\"o\">,<\/span> <span class=\"n\">from<\/span><span class=\"o\">,<\/span> <span class=\"n\">to<\/span><span class=\"o\">,<\/span> <span class=\"n\">amount<\/span><span class=\"o\">);<\/span>\r\n  <span class=\"o\">}<\/span> <span class=\"k\">else<\/span> <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">action<\/span><span class=\"o\">.<\/span><span class=\"na\">equalsIgnoreCase<\/span><span class=\"o\">(<\/span><span class=\"s\">\"balances\"<\/span><span class=\"o\">))<\/span> <span class=\"o\">{<\/span>\r\n   <span class=\"n\">eMoney<\/span><span class=\"o\">.<\/span><span class=\"na\">balances<\/span><span class=\"o\">(<\/span><span class=\"n\">group<\/span><span class=\"o\">);<\/span>\r\n  <span class=\"o\">}<\/span> <span class=\"k\">else<\/span> <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">action<\/span><span class=\"o\">.<\/span><span class=\"na\">equalsIgnoreCase<\/span><span class=\"o\">(<\/span><span class=\"s\">\"delete\"<\/span><span class=\"o\">))<\/span> <span class=\"o\">{<\/span>\r\n   <span class=\"n\">eMoney<\/span><span class=\"o\">.<\/span><span class=\"na\">deleteUser<\/span><span class=\"o\">(<\/span><span class=\"n\">group<\/span><span class=\"o\">,<\/span> <span class=\"n\">to<\/span><span class=\"o\">);<\/span>\r\n  <span class=\"o\">}<\/span>\r\n  <span class=\"n\">eMoney<\/span><span class=\"o\">.<\/span><span class=\"na\">close<\/span><span class=\"o\">();<\/span>\r\n <span class=\"o\">}<\/span>\r\n\r\n <span class=\"kd\">private<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">printUsageAndExit<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n  <span class=\"nc\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">err<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span>\r\n   <span class=\"s\">\"ElectronicMoneyMain -action charge\/pay\/balances\/delete -group id -to id [-amount number (needed for charge\/pay)] [-from id (needed for pay)]\"<\/span>\r\n  <span class=\"o\">);<\/span>\r\n  <span class=\"nc\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">exit<\/span><span class=\"o\">(<\/span><span class=\"mi\">1<\/span><span class=\"o\">);<\/span>\r\n <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u6267\u884c<\/h2>\n<p>1. \u5145\u7535<\/p>\n<p>\u7ed9\u7528\u62371\u5145\u503c1000\uff0c\u8bf7\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u884c\u53c2\u6570\u8fd0\u884cGradle\uff1a<br \/>\n$ gradle run &#8211;args=&#8221;-action \u5145\u503c -amount 1000 -group groupA -to user1&#8243;<\/p>\n<p>\u4ee5\u539f\u751f\u4e2d\u6587\u8f6c\u8ff0\u5982\u4e0b\uff1a<br \/>\n\u7ed9\u7528\u62372\u5145\u503c0<br \/>\n$ gradle run &#8211;args=&#8221;-action charge -amount 0 -group groupA -to user2&#8243;<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d9279913a08637a6e2bc3\/62-0.png\" alt=\"image.png\" \/><\/div>\n<p>2. \u4ed8\u6b3e<\/p>\n<p>\u7528\u62371\u5411\u7528\u62372\u652f\u4ed8300\u5143\u3002<br \/>\n\u8bf7\u8f93\u5165\u4ee5\u4e0b\u547d\u4ee4\u6267\u884c\uff1agradle run &#8211;args=&#8221;-action pay -amount 300 -group groupA -to user2 -from user1&#8243;\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d9279913a08637a6e2bc3\/65-0.png\" alt=\"image.png\" \/><\/div>\n<p>3. \u7528\u6237\u5220\u9664<\/p>\n<p>\u5220\u9664\u7528\u62371<br \/>\n$ gradle run &#8211;args=&#8221;-action delete -group groupA -to user1&#8243;<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d9279913a08637a6e2bc3\/68-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u786e\u8ba4\u4ea4\u6613\u529f\u80fd<\/p>\n<p>\u4e3a\u4e86\u786e\u8ba4\u4ea4\u6613\u529f\u80fd\u6b63\u5e38\u8fd0\u884c\uff0c\u9700\u8981\u4fee\u6539ElectronicMoney.java\u6587\u4ef6\u3002<\/p>\n<p>$ vi \u7535\u5b50\u8d27\u5e01.java<\/p>\n<pre class=\"post-pre\"><code>  <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">pay<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span> <span class=\"n\">groupId<\/span><span class=\"o\">,<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">fromId<\/span><span class=\"o\">,<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">toId<\/span><span class=\"o\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">amount<\/span><span class=\"o\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"nc\">CrudException<\/span><span class=\"o\">,<\/span>   <span class=\"nc\">CommitException<\/span><span class=\"o\">,<\/span> <span class=\"nc\">UnknownTransactionStatusException<\/span> <span class=\"o\">{<\/span>\r\n   <span class=\"c1\">\/\/ \u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u958b\u59cb<\/span>\r\n   <span class=\"nc\">DistributedTransaction<\/span> <span class=\"n\">tx<\/span> <span class=\"o\">=<\/span> <span class=\"n\">transactionService<\/span><span class=\"o\">.<\/span><span class=\"na\">start<\/span><span class=\"o\">();<\/span>\r\n   <span class=\"c1\">\/\/ \u9001\u91d1\u5143\u3001\u9001\u91d1\u5148\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u60c5\u5831\u3092\u53d6\u5f97<\/span>\r\n   <span class=\"nc\">Key<\/span> <span class=\"n\">partitionKey<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Key<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">TextValue<\/span><span class=\"o\">(<\/span><span class=\"no\">GROUP_ID<\/span><span class=\"o\">,<\/span> <span class=\"n\">groupId<\/span><span class=\"o\">));<\/span>\r\n   <span class=\"nc\">Key<\/span> <span class=\"n\">fromKey<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Key<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">TextValue<\/span><span class=\"o\">(<\/span><span class=\"no\">ID<\/span><span class=\"o\">,<\/span> <span class=\"n\">fromId<\/span><span class=\"o\">));<\/span>\r\n   <span class=\"nc\">Key<\/span> <span class=\"n\">toKey<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Key<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">TextValue<\/span><span class=\"o\">(<\/span><span class=\"no\">ID<\/span><span class=\"o\">,<\/span> <span class=\"n\">toId<\/span><span class=\"o\">));<\/span>\r\n   <span class=\"nc\">Get<\/span> <span class=\"n\">fromGet<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Get<\/span><span class=\"o\">(<\/span><span class=\"n\">partitionKey<\/span><span class=\"o\">,<\/span> <span class=\"n\">fromKey<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"nc\">Get<\/span> <span class=\"n\">toGet<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Get<\/span><span class=\"o\">(<\/span><span class=\"n\">partitionKey<\/span><span class=\"o\">,<\/span> <span class=\"n\">toKey<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"nc\">Optional<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">Result<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">fromResult<\/span> <span class=\"o\">=<\/span> <span class=\"n\">tx<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">(<\/span><span class=\"n\">fromGet<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"nc\">Optional<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">Result<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">toResult<\/span> <span class=\"o\">=<\/span> <span class=\"n\">tx<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">(<\/span><span class=\"n\">toGet<\/span><span class=\"o\">);<\/span>\r\n\r\n   <span class=\"k\">if<\/span> <span class=\"o\">(!<\/span><span class=\"n\">fromResult<\/span><span class=\"o\">.<\/span><span class=\"na\">isPresent<\/span><span class=\"o\">())<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">RuntimeException<\/span><span class=\"o\">(<\/span><span class=\"n\">fromId<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" doesn't exist.\"<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"o\">}<\/span>\r\n   <span class=\"k\">if<\/span> <span class=\"o\">(!<\/span><span class=\"n\">toResult<\/span><span class=\"o\">.<\/span><span class=\"na\">isPresent<\/span><span class=\"o\">())<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">RuntimeException<\/span><span class=\"o\">(<\/span><span class=\"n\">toId<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" doesn't exist.\"<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"o\">}<\/span>\r\n   <span class=\"kt\">int<\/span> <span class=\"n\">newFromBalance<\/span> <span class=\"o\">=<\/span> <span class=\"o\">((<\/span><span class=\"nc\">IntValue<\/span><span class=\"o\">)<\/span> <span class=\"o\">(<\/span><span class=\"n\">fromResult<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">().<\/span><span class=\"na\">getValue<\/span><span class=\"o\">(<\/span><span class=\"no\">BALANCE<\/span><span class=\"o\">).<\/span><span class=\"na\">get<\/span><span class=\"o\">())).<\/span><span class=\"na\">get<\/span><span class=\"o\">()<\/span> <span class=\"o\">-<\/span> <span class=\"n\">amount<\/span><span class=\"o\">;<\/span>\r\n   <span class=\"kt\">int<\/span> <span class=\"n\">newToBalance<\/span> <span class=\"o\">=<\/span> <span class=\"o\">((<\/span><span class=\"nc\">IntValue<\/span><span class=\"o\">)<\/span> <span class=\"o\">(<\/span><span class=\"n\">toResult<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">().<\/span><span class=\"na\">getValue<\/span><span class=\"o\">(<\/span><span class=\"no\">BALANCE<\/span><span class=\"o\">).<\/span><span class=\"na\">get<\/span><span class=\"o\">())).<\/span><span class=\"na\">get<\/span><span class=\"o\">()<\/span> <span class=\"o\">+<\/span> <span class=\"n\">amount<\/span><span class=\"o\">;<\/span>\r\n   <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">newFromBalance<\/span> <span class=\"o\">&lt;<\/span> <span class=\"mi\">0<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">RuntimeException<\/span><span class=\"o\">(<\/span><span class=\"n\">fromId<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" doesn't have enough balances.\"<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"o\">}<\/span>\r\n\r\n   <span class=\"c1\">\/\/ \u6b8b\u9ad8\u3092\u66f4\u65b0<\/span>\r\n   <span class=\"nc\">Put<\/span> <span class=\"n\">fromPut<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Put<\/span><span class=\"o\">(<\/span><span class=\"n\">partitionKey<\/span><span class=\"o\">,<\/span> <span class=\"n\">fromKey<\/span><span class=\"o\">).<\/span><span class=\"na\">withValue<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">IntValue<\/span><span class=\"o\">(<\/span><span class=\"no\">BALANCE<\/span><span class=\"o\">,<\/span> <span class=\"n\">newFromBalance<\/span><span class=\"o\">));<\/span>\r\n   <span class=\"c1\">\/\/ ----------------\u3053\u3053\u304b\u3089\u8ffd\u52a0\u884c-----------------------<\/span>\r\n   <span class=\"c1\">\/\/ \u5b9f\u9a13\u7528\u306b\u5fc5\u305a\u30a8\u30e9\u30fc\u3092throw\u3059\u308b\u6587\u306e\u8ffd\u52a0<\/span>\r\n   <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">newFromBalance<\/span> <span class=\"o\">&gt;=<\/span> <span class=\"mi\">0<\/span><span class=\"o\">){<\/span>\r\n    <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">RuntimeException<\/span><span class=\"o\">(<\/span><span class=\"s\">\"test error.\"<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"o\">}<\/span>\r\n   <span class=\"c1\">\/\/ ----------------\u3053\u3053\u307e\u3067\u8ffd\u52a0\u884c-----------------------<\/span>\r\n   <span class=\"c1\">\/\/ \u9001\u91d1\u5148\u306e\u6b8b\u9ad8\u306f\u66f4\u65b0\u3055\u308c\u306a\u3044<\/span>\r\n   <span class=\"nc\">Put<\/span> <span class=\"n\">toPut<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Put<\/span><span class=\"o\">(<\/span><span class=\"n\">partitionKey<\/span><span class=\"o\">,<\/span> <span class=\"n\">toKey<\/span><span class=\"o\">).<\/span><span class=\"na\">withValue<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">IntValue<\/span><span class=\"o\">(<\/span><span class=\"no\">BALANCE<\/span><span class=\"o\">,<\/span> <span class=\"n\">newToBalance<\/span><span class=\"o\">));<\/span>\r\n   <span class=\"n\">tx<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"n\">fromPut<\/span><span class=\"o\">);<\/span>   <span class=\"n\">tx<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"n\">toPut<\/span><span class=\"o\">);<\/span>\r\n   <span class=\"c1\">\/\/ \u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u30b3\u30df\u30c3\u30c8<\/span>\r\n   <span class=\"n\">tx<\/span><span class=\"o\">.<\/span><span class=\"na\">commit<\/span><span class=\"o\">();<\/span>\r\n  <span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u4f7f\u7528\u80051\u5145\u503c1000\u3002<br \/>\n$ gradle run &#8211;args=&#8221;-action charge -amount 1000 -group groupA -to user1&#8243;<\/p>\n<p>\u4ee5\u539f\u751f\u7684\u4e2d\u6587\u65b9\u5f0f\u8868\u8fbe\u4e0a\u8ff0\u53e5\u5b50\uff08\u53ea\u63d0\u4f9b\u4e00\u4e2a\u9009\u9879\uff09\uff1a<br \/>\n\u7528\u62372\u5145\u503c0\u5143<br \/>\n$ gradle run &#8211;args=&#8221;-action \u5145\u503c -amount 0 -group \u7ec4A -to \u7528\u62372&#8243;<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d9279913a08637a6e2bc3\/75-2.png\" alt=\"image.png\" \/><\/div>\n<p>\u4ee5\u4e0a\u5c31\u662f\u793a\u4f8b\u5e94\u7528\u7684\u6267\u884c\u60c5\u51b5\u3002\u975e\u5e38\u611f\u8c22\u60a8\u7684\u9605\u8bfb\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u672c\u7bc7\u6587\u7ae0\u662f\u6709\u5173\u521b\u5efa\u6837\u672c\u5e94\u7528\u7a0b\u5e8f\u90e8\u5206\uff0c\u5728\u6b64\u6211\u5c06\u8fd0\u884c ScalarDB \u7684\u6837\u672c\u5e94\u7528\u7a0b\u5e8f\u3002 &#8220;Envir [&hellip;]<\/p>\n","protected":false},"author":9,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-50630","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u5c1d\u8bd5\u5728WSL Ubuntu\u4e0a\u8fd0\u884cScalarDB\uff08\u521b\u5efa\u793a\u4f8b\u5e94\u7528\u7a0b\u5e8f\u90e8\u5206\uff09 - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5c1d\u8bd5\u5728wsl-ubuntu\u4e0a\u8fd0\u884cscalardb\uff08\u521b\u5efa\u793a\u4f8b\u5e94\u7528\u7a0b\u5e8f\u90e8\u5206\uff09\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u5c1d\u8bd5\u5728WSL Ubuntu\u4e0a\u8fd0\u884cScalarDB\uff08\u521b\u5efa\u793a\u4f8b\u5e94\u7528\u7a0b\u5e8f\u90e8\u5206\uff09\" \/>\n<meta property=\"og:description\" content=\"\u672c\u7bc7\u6587\u7ae0\u662f\u6709\u5173\u521b\u5efa\u6837\u672c\u5e94\u7528\u7a0b\u5e8f\u90e8\u5206\uff0c\u5728\u6b64\u6211\u5c06\u8fd0\u884c ScalarDB \u7684\u6837\u672c\u5e94\u7528\u7a0b\u5e8f\u3002 &#8220;Envir [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5c1d\u8bd5\u5728wsl-ubuntu\u4e0a\u8fd0\u884cscalardb\uff08\u521b\u5efa\u793a\u4f8b\u5e94\u7528\u7a0b\u5e8f\u90e8\u5206\uff09\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-03-15T02:00:57+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-30T03:59:54+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d9279913a08637a6e2bc3\/18-0.png\" \/>\n<meta name=\"author\" content=\"\u6e05, \u626c\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u6e05, \u626c\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%9c%a8wsl-ubuntu%e4%b8%8a%e8%bf%90%e8%a1%8cscalardb%ef%bc%88%e5%88%9b%e5%bb%ba%e7%a4%ba%e4%be%8b%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e9%83%a8%e5%88%86%ef%bc%89%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%9c%a8wsl-ubuntu%e4%b8%8a%e8%bf%90%e8%a1%8cscalardb%ef%bc%88%e5%88%9b%e5%bb%ba%e7%a4%ba%e4%be%8b%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e9%83%a8%e5%88%86%ef%bc%89%e3%80%82\/\",\"name\":\"\u5c1d\u8bd5\u5728WSL Ubuntu\u4e0a\u8fd0\u884cScalarDB\uff08\u521b\u5efa\u793a\u4f8b\u5e94\u7528\u7a0b\u5e8f\u90e8\u5206\uff09 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-03-15T02:00:57+00:00\",\"dateModified\":\"2024-04-30T03:59:54+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/cb5556d2501da73d864cac945e8d9461\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%9c%a8wsl-ubuntu%e4%b8%8a%e8%bf%90%e8%a1%8cscalardb%ef%bc%88%e5%88%9b%e5%bb%ba%e7%a4%ba%e4%be%8b%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e9%83%a8%e5%88%86%ef%bc%89%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%9c%a8wsl-ubuntu%e4%b8%8a%e8%bf%90%e8%a1%8cscalardb%ef%bc%88%e5%88%9b%e5%bb%ba%e7%a4%ba%e4%be%8b%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e9%83%a8%e5%88%86%ef%bc%89%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%9c%a8wsl-ubuntu%e4%b8%8a%e8%bf%90%e8%a1%8cscalardb%ef%bc%88%e5%88%9b%e5%bb%ba%e7%a4%ba%e4%be%8b%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e9%83%a8%e5%88%86%ef%bc%89%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u5c1d\u8bd5\u5728WSL Ubuntu\u4e0a\u8fd0\u884cScalarDB\uff08\u521b\u5efa\u793a\u4f8b\u5e94\u7528\u7a0b\u5e8f\u90e8\u5206\uff09\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/cb5556d2501da73d864cac945e8d9461\",\"name\":\"\u6e05, \u626c\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g\",\"caption\":\"\u6e05, \u626c\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/qingyang\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%9c%a8wsl-ubuntu%e4%b8%8a%e8%bf%90%e8%a1%8cscalardb%ef%bc%88%e5%88%9b%e5%bb%ba%e7%a4%ba%e4%be%8b%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e9%83%a8%e5%88%86%ef%bc%89%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u5c1d\u8bd5\u5728WSL Ubuntu\u4e0a\u8fd0\u884cScalarDB\uff08\u521b\u5efa\u793a\u4f8b\u5e94\u7528\u7a0b\u5e8f\u90e8\u5206\uff09 - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u5c1d\u8bd5\u5728wsl-ubuntu\u4e0a\u8fd0\u884cscalardb\uff08\u521b\u5efa\u793a\u4f8b\u5e94\u7528\u7a0b\u5e8f\u90e8\u5206\uff09\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u5c1d\u8bd5\u5728WSL Ubuntu\u4e0a\u8fd0\u884cScalarDB\uff08\u521b\u5efa\u793a\u4f8b\u5e94\u7528\u7a0b\u5e8f\u90e8\u5206\uff09","og_description":"\u672c\u7bc7\u6587\u7ae0\u662f\u6709\u5173\u521b\u5efa\u6837\u672c\u5e94\u7528\u7a0b\u5e8f\u90e8\u5206\uff0c\u5728\u6b64\u6211\u5c06\u8fd0\u884c ScalarDB \u7684\u6837\u672c\u5e94\u7528\u7a0b\u5e8f\u3002 &#8220;Envir [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u5c1d\u8bd5\u5728wsl-ubuntu\u4e0a\u8fd0\u884cscalardb\uff08\u521b\u5efa\u793a\u4f8b\u5e94\u7528\u7a0b\u5e8f\u90e8\u5206\uff09\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-03-15T02:00:57+00:00","article_modified_time":"2024-04-30T03:59:54+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d9279913a08637a6e2bc3\/18-0.png"}],"author":"\u6e05, \u626c","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u6e05, \u626c","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"6 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%9c%a8wsl-ubuntu%e4%b8%8a%e8%bf%90%e8%a1%8cscalardb%ef%bc%88%e5%88%9b%e5%bb%ba%e7%a4%ba%e4%be%8b%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e9%83%a8%e5%88%86%ef%bc%89%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%9c%a8wsl-ubuntu%e4%b8%8a%e8%bf%90%e8%a1%8cscalardb%ef%bc%88%e5%88%9b%e5%bb%ba%e7%a4%ba%e4%be%8b%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e9%83%a8%e5%88%86%ef%bc%89%e3%80%82\/","name":"\u5c1d\u8bd5\u5728WSL Ubuntu\u4e0a\u8fd0\u884cScalarDB\uff08\u521b\u5efa\u793a\u4f8b\u5e94\u7528\u7a0b\u5e8f\u90e8\u5206\uff09 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-03-15T02:00:57+00:00","dateModified":"2024-04-30T03:59:54+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/cb5556d2501da73d864cac945e8d9461"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%9c%a8wsl-ubuntu%e4%b8%8a%e8%bf%90%e8%a1%8cscalardb%ef%bc%88%e5%88%9b%e5%bb%ba%e7%a4%ba%e4%be%8b%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e9%83%a8%e5%88%86%ef%bc%89%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%9c%a8wsl-ubuntu%e4%b8%8a%e8%bf%90%e8%a1%8cscalardb%ef%bc%88%e5%88%9b%e5%bb%ba%e7%a4%ba%e4%be%8b%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e9%83%a8%e5%88%86%ef%bc%89%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%9c%a8wsl-ubuntu%e4%b8%8a%e8%bf%90%e8%a1%8cscalardb%ef%bc%88%e5%88%9b%e5%bb%ba%e7%a4%ba%e4%be%8b%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e9%83%a8%e5%88%86%ef%bc%89%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u5c1d\u8bd5\u5728WSL Ubuntu\u4e0a\u8fd0\u884cScalarDB\uff08\u521b\u5efa\u793a\u4f8b\u5e94\u7528\u7a0b\u5e8f\u90e8\u5206\uff09"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/cb5556d2501da73d864cac945e8d9461","name":"\u6e05, \u626c","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g","caption":"\u6e05, \u626c"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/qingyang\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%9c%a8wsl-ubuntu%e4%b8%8a%e8%bf%90%e8%a1%8cscalardb%ef%bc%88%e5%88%9b%e5%bb%ba%e7%a4%ba%e4%be%8b%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e9%83%a8%e5%88%86%ef%bc%89%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/50630","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=50630"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/50630\/revisions"}],"predecessor-version":[{"id":91783,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/50630\/revisions\/91783"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=50630"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=50630"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=50630"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}