Dbms最佳实践

时间:2014-12-21 21:35:55

标签: database

我对使用DBMS进行编程有一些疑问(不需要特定的语言,但我使用的是Java;没有特定的DBMS)。

我打开一个事务,选择一行,然后读取一个字段,向该字段添加1,然后更新,然后提交。如果另一个用户在该字段上的事务同时运行会发生什么?它会导致交易崩溃,还是什么?

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

select row "bread"
if quantity>=1 kg then quantity=quantity-1
update row

如果两个服务员同时运行交易会怎样?

实现多用户的最佳方法是什么,避免"碰撞"?选择并锁定,仅限交易,还是什么?

何时使用乐观锁定或悲观?

何时使用锁定,何时不需要?

2 个答案:

答案 0 :(得分:0)

为什么要在应用程序端处理此问题?建立关系数据库来处理这样的情况。只需使用update声明:

UPDATE some_table
SET    quantity = quantity - 1
WHERE  item_name = 'bread' AND quantity >= 1

答案 1 :(得分:0)

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

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

<强>序列化

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

可重复读取

第一个事务一读完,第二个事务将等到第一个事务提交。或者反过来说,如果第二次交易以某种方式开始在第一次交易之前开始阅读。

读取已提交

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

读取未提交

两者都可以在没有问题的情况下阅读,但是第一个写入会使另一个写入停顿,直到事务被提交为止。

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