首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dbms最佳实践

Dbms最佳实践
EN

Stack Overflow用户
提问于 2014-12-22 05:35:55
回答 2查看 121关注 0票数 0

我有一些关于使用DBMS进行编程的问题(不需要特定的语言,但我使用的是Java;考虑的不是特定的DBMS )。

我打开一个事务,选择一行,然后读取一个字段,将该字段加1,然后更新,然后提交。如果另一个用户同时在该字段上运行事务,会发生什么情况?它会使事务崩溃,还是怎样?

例如:我在一家有1公斤面包的商店里。Waiter1有一个客户需要1公斤面包。Waiter2是一样的。如果程序是:

代码语言:javascript
复制
select row "bread"
if quantity>=1 kg then quantity=quantity-1
update row

如果两个服务员同时运行事务,会发生什么情况?

实现多用户,避免“冲突”的最好方法是什么?选择并锁定,仅事务,还是什么?

什么时候使用乐观锁,还是悲观锁?

什么时候使用锁,什么时候不需要锁?

EN

回答 2

Stack Overflow用户

发布于 2014-12-22 05:38:49

为什么要在应用程序端处理这个问题?关系数据库就是为处理这种情况而构建的。只需使用一条update语句:

代码语言:javascript
复制
UPDATE some_table
SET    quantity = quantity - 1
WHERE  item_name = 'bread' AND quantity >= 1
票数 0
EN

Stack Overflow用户

发布于 2014-12-22 06:03:33

你要找的是Transaction Isolation。官方SQL标准会这样处理它:

如果您没有明确地锁定,您的数据库通常会为您锁定行甚至表。根据您的隔离级别,它将等待或引发错误。

可序列化

第二个事务将等待第一个事务完成,然后才能执行任何操作。

可重复读取

第一个事务一读取,第二个事务就会一直等到第一个事务提交。或者反过来,如果第二个事务在第一个事务之前开始读取。

读取提交的

如果第一个事务在第二个事务之前写入,则第一个事务必须等待,直到第二个事务提交。否则,第二个将不得不等到第一个提交。

读取未提交的

两者都可以无问题地读取,但是第一次写入将使另一次写入停止,直到事务提交。

如果其中一个事务在另一个事务读取之后提交,您可能会丢失数据,最终只有一次更新。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27594091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档