Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HSQLDB的悲观行锁定_Java_Database_Locking_Hsqldb - Fatal编程技术网

Java HSQLDB的悲观行锁定

Java HSQLDB的悲观行锁定,java,database,locking,hsqldb,Java,Database,Locking,Hsqldb,我需要为连接显式锁定表中的一行,这: 读取数据; 一些逻辑将在两者之间运行 更新数据库中相应的行; 虽然其他连接无法读取数据,但禁用脏读,因此隔离级别是不可能的 阅读这篇文章,但不要完全理解它。我目前的理解是否正确: 将并发控制模型设置为MVCC; 将事务隔离级别设置为实际读取已提交的默认值; 对于手头的连接对象,将autocommit值设置为false; 创建报表/准备报表; 对语句或PreparedStatement对象运行“SELECT/-/FOR UPDATE”查询并接收结果集; -执行

我需要为连接显式锁定表中的一行,这:

读取数据; 一些逻辑将在两者之间运行 更新数据库中相应的行; 虽然其他连接无法读取数据,但禁用脏读,因此隔离级别是不可能的

阅读这篇文章,但不要完全理解它。我目前的理解是否正确:

将并发控制模型设置为MVCC; 将事务隔离级别设置为实际读取已提交的默认值; 对于手头的连接对象,将autocommit值设置为false; 创建报表/准备报表; 对语句或PreparedStatement对象运行“SELECT/-/FOR UPDATE”查询并接收结果集; -执行一些逻辑- 使用ResultSet updateX方法或new update sql executeUpdate更新行。 提交更改。
是否有任何步骤是多余的、遗漏的或我完全误解了整个概念?

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

创建语句 使用行的现有值或更改的值(如果此时已知)更新行 执行其他操作 如果以前未执行此操作,请使用更改的值更新行 犯罪
如果您不按上述方式操作,则另一个事务可能会在该事务更改行之前更改该行。

为什么不选择/-/作为“更新”,为其他事务锁定该行?你的第二步真的是锁定它的方法吗?即使用现有或更改的值进行更新?另外,如果并发模型没有设置为MVCC,那么整个表将被锁定,而不是一行,对吗?不会。第二步是锁定行。如果模型不是MVCC,则锁定整个表。如果不使用MVCC而不是第一次更新,您可以显式锁定表以进行写入。我不知道这是如何实现悲观锁定的。因此,如果流量为:1。启动事务2。选择3。用当前值更新4。一些应用程序代码5。使用更新值6进行更新。提交如果两个线程同时执行此操作,线程2将在步骤3阻塞。但是,当第一个线程提交时,线程2将继续,并执行步骤3中的更新,覆盖线程1中保存的值。->更新丢失。所以我不认为这个策略真的有效?我需要能够做选择。。。更新。欢迎使用任何提示,MVCC没有悲观锁定。使用锁定模式进行悲观锁定。