2014-02-24 42 views
0

锁定我需要明确地锁定在表中的行对一个连接,其中:悲观行与HSQLDB

  • 读取数据;
  • (有些逻辑会在两者之间运行)
  • 更新db中的对应行;

虽然其他连接将无法读取数据,禁用脏读(所以隔离级别是没有问题的)。

阅读documentation,但没有完全理解它。我目前的理解是否正确:

  • 将并发控制模型设置为MVCC;
  • 将事务隔离级别设置为READ COMMITTED(实际上已经是默认值);
  • 将Connection对象的自动提交值设置为false;
  • create Statement/PreparedStatement;
  • 在语句或PreparedStatement对象上运行'SELECT/-/FOR UPDATE'查询并接收ResultSet;
  • - 执行一些逻辑 -
  • 使用ResultSet updateX()方法或新的UPDATE sql(executeUpdate())更新该行。
  • 提交更改。

是否有任何步骤是多余的,丢失或者我完全误解了整个概念?

回答

0

正确的方法是在开始和结束时更新行。下面是创建语句的步骤。

  • CREATE语句
  • 更新该行凭借其现有的值(或更改的值如果在这一点上已知的)
  • 执行其他操作
  • 更新与改变的值的行(如果不这样做前)
  • 提交

如果你不这样做,像上面,其他事务可能这个交易之前更改行罐体C将它吊起来。

+0

为什么“SELECT/-/FOR UPDATE”锁定其他事务的行?真的是你的第二步来锁定它(即更新现有或更改的值)? PS,如果并发模型没有设置为MVCC,那么整个表被锁定,而不是一行,对不对? – basher

+0

它没有。第二步是锁定行。如果该模型不是MVCC,则整个表被锁定。如果不使用MVCC,而不是第一次更新,则可以将表锁定为明确写入。 – fredt

+0

我不明白这是如何实现悲观锁定的。 所以如果流量是: 1.开始交易 2.选择 3.更新(与当前值) 4。(一些应用程序代码) 5.更新(具有更新值) 6.提交 如果2个线程同时执行此操作,则线程2将在步骤3中阻塞。 但是,当第一个线程提交时,线程2将继续,并且将执行步骤#3的更新,并覆盖保存在线程1中的值。 - >丢失更新。 所以我不认为这个策略实际上有效? 我需要能够做SELECT ... FOR UPDATE。任何提示欢迎, –