怎么才能有效防止并发情况下创建重复的数据库记录?

2019-03-25 13:48|来源: 网路

在实际开发中,偶尔会碰到有重复的数据库记录产生。比如创建一条记录,条件是该记录不存在。但是同时运行两个这样的动作会造成生成两条记录。如果在代码的层面,比如方法上或者代码段上增加synchronized并不能避免该问题,而且性能还会受到影响。前提是数据库事务隔离级别是读提交,在这样的情况下,后运行的操作,在前面运行的操作没提交事务时,无法读取到已经插入的记录情况。想了很久也没想到什么好的办法,请大家给出出主意。

相关问答

更多
  • 1.单例顾名思义:一个个排队过... 高访问量的时候, 你能想象服务器的压力了... 而且用户体验也不怎么好,等待太久~ 2.实质上这种理解是错误的,Java里有个API叫做ThreadLocal, spring单例模式下用它来切换不同线程之间的参数。用ThreadLocal是为了保证线程安全, 实际上ThreadLoacal的key就是当前线程的Thread实例。单例模式下, spring把每个线程可能存在线程安全问题的参数值放进了ThreadLocal。 这样虽然是一个实例在操作,但是不同线程下的数据互 ...
  • 几点需要注意: 尽量使用缓存,包括用户缓存,信息缓存等,多花点内存来做缓存,可以大量减少与数据库的交互,提高性能。 用jprofiler等工具找出性能瓶颈,减少额外的开销。 优化数据库查询语句,减少直接使用hibernate等工具的直接生成语句
  • 几点需要注意: 尽量使用缓存,包括用户缓存,信息缓存等,多花点内存来做缓存,可以大量减少与数据库的交互,提高性能。 用jprofiler等工具找出性能瓶颈,减少额外的开销。 优化数据库查询语句,减少直接使用hibernate等工具的直接生成语句
  • 1.数据库文件直接在你发的图的管理软件来操作就行 2.创建了数据库后,如果是建立论坛什么的基本不用去动,安装的时候会自动添加表 3.information_schema,mysql,performance _schema,test数据库是sql服务器的系统数据库,不要去动他们
  • update理论上都有锁,只要不死锁,就问题不大 如你在一个事务中 update user where userid=1; update dept where deptid=2; commit; 而另一个连接 update dept where deptid=2; update user where userid=1; commit; 如果这2个连接同时执行这些语句,就可能死锁。 所以要特别注意update的表的顺序和where 条件的中记录的执行顺序(对参数先排序) 1) update user set ...
  • 按你的描述应该是出现了脏读。 看你写的sql,用的是乐观锁。 俩个解决方案: 1、建议你查下自己的应用代码,是否有做防止脏读的处理,如果没有就做下代码同步处理; 2、建议使用悲观锁(如果你的系统需要承载非常大的并发,建议不要采用)
  • 您可以使用url compression + encrypting / base64方法。 对于压缩,您可以检查python的zlib或任何其他无损压缩库(lzma等),然后通过base64将压缩的二进制字符串转换为ascii。 为了您的信息,您的网址的zlib + base64比原始网址差。 但是网址可能永远不会像您期望的那么短,仅仅是因为网址内容包含大量信息,压缩率不佳等等。因此,此解决方案可能永远不会满足文本长度限制的应用程序(如twitter) 。 因此,如果你想要一个真正的短网址,必须有一个地方存 ...
  • 如果job2成功完成,那么将在employee表中插入多少条记录? 1还是0? 1 更准确地说,job2的第1步可以看到job1插入的员工记录吗? 由于您说回滚了job1,因此job1没有插入员工记录。 job1告诉数据库,“我想插入员工记录。” 然后,DB2在行,页或表上放置写锁。 定义表后,数据库分析员(DBA)确定表写入锁定的级别。 默认为page。 只要写锁定存在,除非读取隔离级别是未提交读取,否则没有其他事务可以读取插入。 我们假设这不是这种情况。 job2必须等待job1提交或回滚,然后db2才 ...
  • 使用带方括号的复选框数组的名称。 例如,如果你想让它成为这些在你的视图中放置这样的东西,在form_for块中(这里我只生成五个复选框,但在你的情况下,你应该按照自己的意愿,并且所有这些都应该具有属性name每个都带有these_ids[] ): ... <% [*1..5].each do |i| %> <%= check_box_tag 'these_ids[]', i %> <% end %> ... 当您提交表单时,您将看到参数: Parameters: { ... "these_ids"=>[ ...
  • 它正在这样做因为你将它分配给Question对象。 它想看看你是否正在添加一个现存的记录参考。 所有Laravel Eloquent模型都包含属性的魔术方法 ,并且尝试将它们用作临时数据存储是一个非常糟糕的主意,除非您为此特定目的提前为它们定义了属性。 只需使用常规数组,然后在准备好模型后将它们关联起来。 关于一对多关系的文档: https://laravel.com/docs/5.1/eloquent-relationships#one-to-many It's doing that because yo ...