Multithreading 多线程环境下的表更新
我有一张桌子,上面写着积分。它有下面几列Multithreading 多线程环境下的表更新,multithreading,asynchronous,transactions,spring-transactions,Multithreading,Asynchronous,Transactions,Spring Transactions,我有一张桌子,上面写着积分。它有下面几列 Copmany Credit points Amount A 100 50 B 200 94 C 250 80 有多个线程将更新此表。有一种方法可以读取信用点,并进行一些计算和更新金额以及信用点。这一计算将需要相当长的时间 假设线程A读取并正在进行一些计算。同时,在A写回之前,线程B正在从表中读取数据,以
Copmany Credit points Amount
A 100 50
B 200 94
C 250 80
有多个线程将更新此表。有一种方法可以读取信用点,并进行一些计算和更新金额以及信用点。这一计算将需要相当长的时间
假设线程A读取并正在进行一些计算。同时,在A写回之前,线程B正在从表中读取数据,以进行计算和更新数据。这里我丢失了线程更新的数据。在许多情况下,由于多个线程正在读取和更新该表,信用积分和金额将不同步
我们可以在这里做的一件事是使用同步方法。
我正在考虑使用spring事务。spring事务线程安全吗?对于这一点,还有什么好的选择?
非常感谢您的帮助
注意:我正在使用ibatis(ORM)和MySQL。您肯定需要事务来确保根据以前读取的数据进行更新。此事务必须包括读写操作。 要确保多个线程协作,您不需要同步,但有两个选项:
- 悲观锁定:使用select进行更新。这将设置一个锁,该锁将在事务结束时释放
- 乐观锁定:在更新过程中,您会发现数据同时发生了更改,如果是这样,您必须重复读取和更改。在更新声明中,您不仅可以搜索公司(我希望是主键),还可以搜索前面阅读的金额和“信用积分”,从而实现这一点
这两种方法都有各自的优点。我建议您在完成此应用程序之前熟悉这些概念。一旦出现重负,如果你做错了什么,你的金额和信用点可能会被错误计算 您肯定需要事务来确保根据以前读取的数据进行更新。此事务必须包括读写操作。 要确保多个线程协作,您不需要同步,但有两个选项:
- 悲观锁定:使用select进行更新。这将设置一个锁,该锁将在事务结束时释放
- 乐观锁定:在更新过程中,您会发现数据同时发生了更改,如果是这样,您必须重复读取和更改。在更新声明中,您不仅可以搜索公司(我希望是主键),还可以搜索前面阅读的金额和“信用积分”,从而实现这一点
这两种方法都有各自的优点。我建议您在完成此应用程序之前熟悉这些概念。一旦出现重负,如果你做错了什么,你的金额和信用点可能会被错误计算 使用spring事务解决了我的问题。感谢您使用spring事务解决了我的问题。谢谢你,阿舒尔克