- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
尝试在多线程环境中在条件账户之间进行转账,我的方法有多真实以及我错在哪里?
按照计划,我在 main 中创建一个新线程,在这个新线程中初始化一个 Transfer 类型的新类,在我从数据库中获取 2 个帐户的数据后,我随机确定我想要的金额随机转移。我将更改翻译并写回数据库。账户中所有资金的总和必须保持正确。也就是说,如果我们有 50 个账户,每个账户有 1000 block 钱(总共 50,000 block ),那么所有交易之后应该不会多,也不会超过 50,000。
如果线程不超过 5-10 个且线程 hibernate 时间超过 500 毫秒,则下面描述的方法有效。也许我解决问题的方法是错误的。我尝试使用tryLock,结果是一样的。总的来说,钱会变成正数,然后变成负数。
另外,我正在尝试在 Hibernate 上执行此操作。
我有什么:
1.对某个银行账户进行类-Account(@Entity)
2. TransferThread类扩展Thread
3. 类(class)转学 - 转学工作 4.主类
现在看起来像这样:类帐户(设置/获取(我没有在这里写它们,但它们在那里)):
public class Account {
private int id;
private int money;
public Account() {
}
public void widrawal(int sum) {
money += sum;
}
public void send(int sum) {
money -= sum;
}
}
类TransferThread(根据想法,完成事务并 hibernate 随机时间(10次)):
public class TransferThread extends Thread {
Transfer transfer= new Transfer();
AtomicInteger atomicInteger = new AtomicInteger();
public void run() {
atomicInteger.set(10);
while (atomicInteger.get() > 0) {
//thread sleep for random time
int a = (int) (Math.random() * (500 - 100)) + 100;
try {
transfer.transaction();
atomicInteger.getAndDecrement();
Thread.sleep(a);
} catch (InterruptedException e) {
}
}
}
}
类(class)转学:
public class Transfer {
public void transaction() throws InterruptedException {
int sumSpis = (int) (Math.random() * 100) + 10;
int ranAccount1 = (int) (Math.random() * 50) + 1;
int ranAccount2 = (int) (Math.random() * 50) + 1;
Account a1 = null;
Account a2 = null;
a1 = HibernateSessionFactoryUtil.getSessionFactory().openSession().get(Account.class, ranAccount1);
a2 = HibernateSessionFactoryUtil.getSessionFactory().openSession().get(Account.class, ranAccount2);
int fromId = a1.getId();
int toId = a2.getId();
if (fromId < toId) {
synchronized (a1) {
synchronized (a2) {
transfer(a1, a2, sumSpis);
}
}
} else {
synchronized (a2) {
synchronized (a1) {
transfer(a1, a2, sumSpis);
}
}
}
System.out.println("amount: " + sumSpis);
}
public void transfer(Account account1, Account account2, int sum) {
if (account1.getId() == account2.getId()) {
System.out.println("same IDs");
return;
}
if (account1.getMoney() < sum) {
System.out.println("not enough account funds");
return;
}
account1.widrawal(sum);
account2.send(sum);
Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
session.update(account1);
session.update(account2);
tx.commit();
session.close();
}
}
最佳答案
操作顺序应如下:获取 session 、启动数据库事务、从数据库获取 acc1 的数据、从数据库获取 acc2 的数据、转账、将 acc1 的数据保存到数据库、将 acc2 的数据保存到数据库、提交数据库事务。
在代码中,您从数据库获取帐户数据并将新数据保存在单独的 session 中,这意味着事务也是单独的。并且有可能在从数据库获取和保存到数据库之间,我的一个线程另一个线程已经更新了这些帐户的数据,并且您正在用过时的数据覆盖该数据。
关于java - Java中的多线程: how to transfer funds between accounts correctly?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61302164/
我正在使用 iOS 版 Plaid API 编写一个程序,该程序在身份验证后访问银行帐户并显示交易数据。 我需要知道是否可以在帐户之间转移资金(支票到储蓄)以及如何转移。 我知道 acorns 使用相
我正在尝试将 Stripe 的 Connect 实现到我的应用程序中。我已经完成了数小时的研究和试错方法调试,现在我遇到的情况是没有出现技术错误,但出现错误: Insufficient funds i
总的来说,我对 JS/JQuery 网络开发还很陌生。 对于一项工作任务,我被要求提出一个解决方案,其中显示列表中的前 3 个基金,如果他们投资超过 3 个,那么将有一个显示所有资金按钮,一旦点击它将
我正在使用 web3.js v1.0.0-beta.34 和 nodeJS v9.11.2 在 Kovan 测试网上执行智能合约。同样的方法适用于我在 Ropsten 上使用另一个智能合约。这是我通过
早上好,我正在处理 DoExpressCheckout 的支付状态响应,用于 InstantPaymentOnly Sale。 https://developer.paypal.com/docs/cl
使用 Composer 时,有时会在安装或更新后显示消息: X packages you are using are looking for funding. Use the `composer fu
尝试在多线程环境中在条件账户之间进行转账,我的方法有多真实以及我错在哪里? 按照计划,我在 main 中创建一个新线程,在这个新线程中初始化一个 Transfer 类型的新类,在我从数据库中获取 2
我正在尝试测试 PayPal 支付。我创建了 PayPal 测试账户,其中一个只有 1 美元。 但是当我尝试与该用户一起购买东西时 - 付款成功。当客户没有足够的资金时,我如何测试案例? 最佳答案 根
我创建了一个 Paypal 批量支付应用程序,但它以“资金不足”错误响应。 代码如下: $value) { $tmpAr = expl
我在使用自适应支付的实时 API 凭据时遇到此错误。 阅读 intrwebs 和文档它必须对帐户权限做一些事情,但公平地说我不知道是哪一个。接收器、api 持有者或应用程序 我已经创建了应用程序,
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
我正在通过 first tutorial in the Ethereum website . 我已经使用 Remix 编译了合约代码并创建了以下脚本。为简洁起见,我删除了二进制字符串: var _gr
谁能告诉我为什么这些代码不能链接到该页面? 我也试过 都没有用。说找不到页面。 最佳答案 试试这个你在“htpps”中有错别字也使用表单的操作参数而不是 onclick,这样做是有意的
我正在尝试设置 PayPal 支付。我的 API 调用已经通过,但在沙箱中我不断收到:Sender has insufficient funds。如何为我的申请添加资金?我似乎找不到指定要发送的帐户的
我有一个带有 ID 的表,问题是我需要提供 N 个 ID(使用 WHERE id IN (1,5,101)),但我需要返回相同数量的记录(如果我发送 100 ids,我需要一个有 100 行的数据集
我正在使用 stripe connect 进行开发和应用。要求用户 S 可以向 stripe connect 托管帐户用户 MA 发送资金。这些资金必须在 MA Stripe 帐户中保留 90 天以上
我想访问 PayPal Giving Fund 慈善机构列表,以便我的网站/应用程序的用户最终可以通过信用卡或 PayPal 捐款。 我研究了其他 API,例如 Just Giving、Orghunt
我正在尝试处理由 PayPal 银行提款产生的交易。 当系统(通过自动转账)或用户将资金从 PayPal 账户转账到关联的银行账户时,就会发生银行提款。这将创建交易类型:“将资金提取到银行账户” 任何
昨天,为了 GDPR/EU CMP 的目的,我试图从 Quantcast Choice 迁移到 Google Funding Choices。出于某种原因,在提示同意并在消息对话框中单击“同意”后,方
我一直想为我的 Django 网站制作支付系统,但使用 PayPal 似乎对用户来说更容易,我听说有专门的 python API,所以它可以与 Django 一起使用。 例如,有用户账户和我的账户,我
我是一名优秀的程序员,十分优秀!