数据库事务并发带来的问题、及并行

 

并发与并行的区别

并发当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式我们称之为并发(Concurrent)

并行:当系统有一个以上CPU,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)

区别:并发和并行是即相似又有区别的两个概念,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生


数据库事务并发带来的问题有:更新丢失、脏读、不可重复读、幻象读。

假设张三办了一张招商银行卡,余额100元,分别说明上述情况。

1、更新丢失:一个事务的更新覆盖了另一个事务的更新。事务A:向银行卡存钱100元。事务B:向银行卡存钱200元。A和B同时读到银行卡的余额,分别更新余额,后提交的事务B覆盖了事务A的更新。更新丢失本质上是写操作的冲突,解决办法是一个一个地写。

2、脏读:一个事务读取了另一个事务未提交的数据。事务A:张三妻子给张三转账100元。事务B:张三查询余额。事务A转账后(还未提交),事务B查询多了100元。事务A由于某种问题,比如超时,进行回滚。事务B查询到的数据是假数据。脏读本质上是读写操作的冲突,解决办法是写完之后再读。

3、不可重复读:一个事务两次读取同一个数据,两次读取的数据不一致。事务A:张三妻子给张三转账100元。事务B:张三两次查询余额。事务B第一次查询余额,事务A还没有转账,第二次查询余额,事务A已经转账了,导致一个事务中,两次读取同一个数据,读取的数据不一致。不可重复读本质上是读写操作的冲突,解决办法是读完再写。

4、幻象读:一个事务两次读取一个范围的记录,两次读取的记录数不一致。事务A:张三妻子两次查询张三有几张银行卡。事务B:张三新办一张银行卡。事务A第一次查询银行卡数的时候,张三还没有新办银行卡,第二次查询银行卡数的时候,张三已经新办了一张银行卡,导致两次读取的银行卡数不一样。幻象读本质上是读写操作的冲突,解决办法是读完再写。

 

转载于:https://www.cnblogs.com/peterYong/p/6556642.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Camunda是一个流程管理和执行平台,用于管理和自动化业务流程。在Camunda中,实体是指在流程中定义的参与者、任务或任何其他业务实体。 当一个实体被另一个事务并发更新时,可能会出现数据冲突的问题。例如,一个事务正在更新实体的某些属性,而另一个事务也在尝试更新相同的属性。这种情况下,会发生竞争条件,可能导致数据不一致或错误的结果。 为了解决这个问题,我们可以采取一些措施。首先,我们可以使用数据库的乐观并发控制机制。这意味着每个事务在进行更新之前会检查实体的版本号,如果有其他事务对同一实体进行了更新,则当前事务将失败并抛出异常。在Camunda中,这可以通过在流程中使用乐观锁来实现。另外,Camunda还提供了并发控制的选项,如并行网关等,以确保在多个事务之间正确地同步和协调实体的更新。 另一个解决方法是使用事务的隔离级别。通过使用适当的隔离级别,我们可以确保并发事务之间的隔离,以减少数据冲突的可能性。例如,可以使用Serializable隔离级别,它会在事务执行期间对数据进行完全锁定,以防止并发更新。 除了上述方法,还可以通过在业务逻辑中进行合适的错误处理和异常处理来解决并发更新的问题。例如,可以捕获并处理由并发更新引起的异常,并根据需要进行相应的重试或回滚操作。 总之,当Camunda中的实体被另一个事务并发更新时,我们可以采取各种措施来解决这个问题,例如使用乐观并发控制机制、适当的事务隔离级别以及错误处理和异常处理。通过正确地处理并发更新,我们可以确保数据的一致性和正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值