我不完全清楚数据库系统中的事务是做什么的。我知道它们可以用来完全回滚更新列表(例如,在一个账户上扣钱,然后添加到另一个账户),但这就是它们所做的全部吗?具体地说,它们可以用来防止竞争条件吗?例如:
// Java/JPA example
em.getTransaction().begin();
User u = em.find(User.class, 123);
u.credits += 10;
em.persist(u); // Note added in 2016: this line is actually not needed
em.getTransaction().commit();
我有一种情况,我有一张大约有500个账户的桌子。这些账户用于提交一些财务交易。当事务启动时,我需要从这个表中获得一个帐户(任何随机帐户都可以工作),然后锁定该行,以便在操作完成之前,没有其他行可以访问该帐户。然后将事务提交到外部系统,然后解锁帐户。
我使用以下算法实现了这一点。这里的所有查询都是在事务上下文中执行的。
//Get Random account
1. select * from gas_accounts where is_locked = false order by random() limit 1
//Lock that account using the primary k
假设作为交易的一部分,我们必须在任何两个帐户之间进行转账(在其他账户中)。
并且会有多个类似的事务在一个典型的多线程环境中并发运行。
通常的约定如下(按照预先设计的约定保持锁顺序):
lock account A
lock account B
transfer(A,B)
release B
release A
是否有任何方法尝试锁并作为原子操作释放?
我正在做我的演示项目-它的简单银行。
我有一个问题。
我需要在我的账户里加一些虚拟的钱。
但是我需要“像原子操作”那样做,我需要在更新之前查询一些数据。
比如:
Query table A // select from table A
Query table B // select from table B
if (A + B > X)
Add money // insert into table C
问题是,在查询A或B期间,另一个线程可以启动一些工作。
我应该使用mysql的哪种技术?
示例:愉快示例
User see A = 1, B = 1 in dashboard
User
我必须实现一个数据库解决方案,其中争用是在集群环境中处理的。有这样一个场景,如果余额小于100美元,多个用户试图同时访问一个银行账户并将钱存入,我如何确保不会有多余的钱被存入?基本上,这个查询应该被触发:-
update acct set balance=balance+25 where acct_no=x ;
由于数据库是集群的,帐户最终会被多次存放。我正在寻找纯粹基于甲骨文的解决方案。
我有一个ASP MVC项目,我想在用户锁定后发送一个解锁帐户锁定链接到用户的电子邮件。我在我的项目中使用asp net identity 2.1。我可以做的是使用asp身份锁定帐户30分钟。在此时间之后,帐户将被解锁。我尝试向用户发送包含重置链接的电子邮件。该链接调用一个方法,该方法具有以下代码。
[AllowAnonymous]
public async Task<ActionResult> UnlockAccount(string userId)
{
await UserManager.ResetAccessFailedCountAsync(userId);
r