Java HSQLDB的悲观行锁定
我需要为连接显式锁定表中的一行,这: 读取数据; 一些逻辑将在两者之间运行 更新数据库中相应的行; 虽然其他连接无法读取数据,但禁用脏读,因此隔离级别是不可能的 阅读这篇文章,但不要完全理解它。我目前的理解是否正确: 将并发控制模型设置为MVCC; 将事务隔离级别设置为实际读取已提交的默认值; 对于手头的连接对象,将autocommit值设置为false; 创建报表/准备报表; 对语句或PreparedStatement对象运行“SELECT/-/FOR UPDATE”查询并接收结果集; -执行一些逻辑- 使用ResultSet updateX方法或new update sql executeUpdate更新行。 提交更改。Java HSQLDB的悲观行锁定,java,database,locking,hsqldb,Java,Database,Locking,Hsqldb,我需要为连接显式锁定表中的一行,这: 读取数据; 一些逻辑将在两者之间运行 更新数据库中相应的行; 虽然其他连接无法读取数据,但禁用脏读,因此隔离级别是不可能的 阅读这篇文章,但不要完全理解它。我目前的理解是否正确: 将并发控制模型设置为MVCC; 将事务隔离级别设置为实际读取已提交的默认值; 对于手头的连接对象,将autocommit值设置为false; 创建报表/准备报表; 对语句或PreparedStatement对象运行“SELECT/-/FOR UPDATE”查询并接收结果集; -执行
是否有任何步骤是多余的、遗漏的或我完全误解了整个概念?正确的方法是在开始和结束时更新行。创建该语句的步骤如下所示 创建语句 使用行的现有值或更改的值(如果此时已知)更新行 执行其他操作 如果以前未执行此操作,请使用更改的值更新行 犯罪
如果您不按上述方式操作,则另一个事务可能会在该事务更改行之前更改该行。为什么不选择/-/作为“更新”,为其他事务锁定该行?你的第二步真的是锁定它的方法吗?即使用现有或更改的值进行更新?另外,如果并发模型没有设置为MVCC,那么整个表将被锁定,而不是一行,对吗?不会。第二步是锁定行。如果模型不是MVCC,则锁定整个表。如果不使用MVCC而不是第一次更新,您可以显式锁定表以进行写入。我不知道这是如何实现悲观锁定的。因此,如果流量为:1。启动事务2。选择3。用当前值更新4。一些应用程序代码5。使用更新值6进行更新。提交如果两个线程同时执行此操作,线程2将在步骤3阻塞。但是,当第一个线程提交时,线程2将继续,并执行步骤3中的更新,覆盖线程1中保存的值。->更新丢失。所以我不认为这个策略真的有效?我需要能够做选择。。。更新。欢迎使用任何提示,MVCC没有悲观锁定。使用锁定模式进行悲观锁定。