0
锁定我需要明确地锁定在表中的行对一个连接,其中:悲观行与HSQLDB
- 读取数据;
- (有些逻辑会在两者之间运行)
- 更新db中的对应行;
虽然其他连接将无法读取数据,禁用脏读(所以隔离级别是没有问题的)。
阅读documentation,但没有完全理解它。我目前的理解是否正确:
- 将并发控制模型设置为MVCC;
- 将事务隔离级别设置为READ COMMITTED(实际上已经是默认值);
- 将Connection对象的自动提交值设置为false;
- create Statement/PreparedStatement;
- 在语句或PreparedStatement对象上运行'SELECT/-/FOR UPDATE'查询并接收ResultSet;
- - 执行一些逻辑 -
- 使用ResultSet updateX()方法或新的UPDATE sql(executeUpdate())更新该行。
- 提交更改。
是否有任何步骤是多余的,丢失或者我完全误解了整个概念?
为什么“SELECT/-/FOR UPDATE”锁定其他事务的行?真的是你的第二步来锁定它(即更新现有或更改的值)? PS,如果并发模型没有设置为MVCC,那么整个表被锁定,而不是一行,对不对? – basher
它没有。第二步是锁定行。如果该模型不是MVCC,则整个表被锁定。如果不使用MVCC,而不是第一次更新,则可以将表锁定为明确写入。 – fredt
我不明白这是如何实现悲观锁定的。 所以如果流量是: 1.开始交易 2.选择 3.更新(与当前值) 4。(一些应用程序代码) 5.更新(具有更新值) 6.提交 如果2个线程同时执行此操作,则线程2将在步骤3中阻塞。 但是,当第一个线程提交时,线程2将继续,并且将执行步骤#3的更新,并覆盖保存在线程1中的值。 - >丢失更新。 所以我不认为这个策略实际上有效? 我需要能够做SELECT ... FOR UPDATE。任何提示欢迎, –