我有一些关于使用DBMS进行编程的问题(不需要特定的语言,但我使用的是Java;考虑的不是特定的DBMS )。
我打开一个事务,选择一行,然后读取一个字段,将该字段加1,然后更新,然后提交。如果另一个用户同时在该字段上运行事务,会发生什么情况?它会使事务崩溃,还是怎样?
例如:我在一家有1公斤面包的商店里。Waiter1有一个客户需要1公斤面包。Waiter2是一样的。如果程序是:
select row "bread"
if quantity>=1 kg then quantity=quantity-1
update row如果两个服务员同时运行事务,会发生什么情况?
实现多用户,避免“冲突”的最好方法是什么?选择并锁定,仅事务,还是什么?
什么时候使用乐观锁,还是悲观锁?
什么时候使用锁,什么时候不需要锁?
发布于 2014-12-22 05:38:49
为什么要在应用程序端处理这个问题?关系数据库就是为处理这种情况而构建的。只需使用一条update语句:
UPDATE some_table
SET quantity = quantity - 1
WHERE item_name = 'bread' AND quantity >= 1发布于 2014-12-22 06:03:33
你要找的是Transaction Isolation。官方SQL标准会这样处理它:
如果您没有明确地锁定,您的数据库通常会为您锁定行甚至表。根据您的隔离级别,它将等待或引发错误。
可序列化
第二个事务将等待第一个事务完成,然后才能执行任何操作。
可重复读取
第一个事务一读取,第二个事务就会一直等到第一个事务提交。或者反过来,如果第二个事务在第一个事务之前开始读取。
读取提交的
如果第一个事务在第二个事务之前写入,则第一个事务必须等待,直到第二个事务提交。否则,第二个将不得不等到第一个提交。
读取未提交的
两者都可以无问题地读取,但是第一次写入将使另一次写入停止,直到事务提交。
如果其中一个事务在另一个事务读取之后提交,您可能会丢失数据,最终只有一次更新。
https://stackoverflow.com/questions/27594091
复制相似问题