Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.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 在数据库中查找对象是否需要开始事务?_Java_Database_Object_Persist - Fatal编程技术网

Java 在数据库中查找对象是否需要开始事务?

Java 在数据库中查找对象是否需要开始事务?,java,database,object,persist,Java,Database,Object,Persist,我知道与数据库中的对象进行交互需要以下几点: db.getTransaction().begin(); //Code to modify objects in the data base db.getTransaction().commit(); 但是当我使用函数find(object.class,object.id)时,有必要吗 在数据库中查找对象是否需要开始事务 取决于“交易”一词的含义 数据库在事务中执行所有操作。时期因此,简单地说,“是”,有必要开始一个事务,因为不这样做就无法与数据库

我知道与数据库中的对象进行交互需要以下几点:

db.getTransaction().begin();
//Code to modify objects in the data base
db.getTransaction().commit();
但是当我使用函数find(object.class,object.id)时,有必要吗

在数据库中查找对象是否需要开始事务

取决于“交易”一词的含义

数据库在事务中执行所有操作。时期因此,简单地说,“是”,有必要开始一个事务,因为不这样做就无法与数据库交互

但是,数据库有一个“方便”的特性,您可以像不存在事务一样工作。这是一个谎言;这仅仅意味着发送给DB的每一条语句都被默默地包装在“启动事务;”中和“提交;”电话。这被称为“自动提交”模式(而不是“无事务模式”),因为这是一个恰当的词:它在每个事务之后自动提交

因此,在基本JDBC中(java中所有基于SQL的DB交互通常都是在其基础层上构建的,但请注意,您使用的是在其上构建的某种库!),您可以通过使用自动提交模式运行选择查询,而无需“费心”处理事务

但是,自动提交模式通常是个坏主意

事务是数据库设计的基础。即使您只是进行“读取”查询,事务仍然很重要。它们保证了一致性和原子性。以下是一个例子:

比如说,你想知道简的银行余额和杰克的银行余额,以检查余额是否足以支付房屋租赁或其他费用

似乎很简单:

SELECT balance FROM bankaccounts WHERE user = 'Jack';
SELECT balance FROM bankaccounts WHERE user = 'Jane';
把它们加起来,对吗

错误

如果在自动提交模式下运行,那么可能Jack有50k,Jane有100k,尽管如此,总和似乎是200k。这是由jack在两个语句之间将他的50k转移给jane完成的,给你一个50k+150k=200k的总数,即使这是一个谎言

因此,事务也适用于只读会话;如果使用正确的隔离级别(SERIALIZABLE是合理的级别),它们甚至会导致重试。通过交易,你会得到正确的答案,每次15万美元,不管简和杰克什么时候或多长时间来回转移资金,试图欺骗你

JDBC本身没有“getTransaction()”或“begin”这样的东西,通常这不是“执行”事务的正确方式。因此,不清楚您在这里使用的是什么第三方库

正确的数据库抽象应该如下所示:

int sum = dbAccess.executeInt(db -> {
  // query or modify things here:
  return
  db.select("SELECT balance FROM bankaccount WHERE user = ?", "Jack").singleInt() +
  db.select("SELECT balance FROM bankaccount WHERE user = ?", "Jane").singleInt();
};
它需要在lambda中处理重试,并且它很好地符合与数据库的所有交互都是事务性的这一事实

你可能想再仔细阅读一下这些文件;这种策略(使用lambdas)可能会追溯到数据库库的开始(lambdas是在java8中添加的;无可否认,那是十年前的事了)

在数据库中查找对象是否需要开始事务

取决于“交易”一词的含义

数据库在事务中执行所有操作。时期因此,简单地说,“是”,有必要开始一个事务,因为不这样做就无法与数据库交互

但是,数据库有一个“方便”的特性,您可以像不存在事务一样工作。这是一个谎言;这仅仅意味着发送给DB的每一条语句都被默默地包装在“启动事务;”中和“提交;”电话。这被称为“自动提交”模式(而不是“无事务模式”),因为这是一个恰当的词:它在每个事务之后自动提交

因此,在基本JDBC中(java中所有基于SQL的DB交互通常都是在其基础层上构建的,但请注意,您使用的是在其上构建的某种库!),您可以通过使用自动提交模式运行选择查询,而无需“费心”处理事务

但是,自动提交模式通常是个坏主意

事务是数据库设计的基础。即使您只是进行“读取”查询,事务仍然很重要。它们保证了一致性和原子性。以下是一个例子:

比如说,你想知道简的银行余额和杰克的银行余额,以检查余额是否足以支付房屋租赁或其他费用

似乎很简单:

SELECT balance FROM bankaccounts WHERE user = 'Jack';
SELECT balance FROM bankaccounts WHERE user = 'Jane';
把它们加起来,对吗

错误

如果在自动提交模式下运行,那么可能Jack有50k,Jane有100k,尽管如此,总和似乎是200k。这是由jack在两个语句之间将他的50k转移给jane完成的,给你一个50k+150k=200k的总数,即使这是一个谎言

因此,事务也适用于只读会话;如果使用正确的隔离级别(SERIALIZABLE是合理的级别),它们甚至会导致重试。通过交易,你会得到正确的答案,每次15万美元,不管简和杰克什么时候或多长时间来回转移资金,试图欺骗你

JDBC本身没有“getTransaction()”或“begin”这样的东西,通常这不是“执行”事务的正确方式。因此,不清楚您在这里使用的是什么第三方库

正确的数据库抽象应该如下所示:

int sum = dbAccess.executeInt(db -> {
  // query or modify things here:
  return
  db.select("SELECT balance FROM bankaccount WHERE user = ?", "Jack").singleInt() +
  db.select("SELECT balance FROM bankaccount WHERE user = ?", "Jane").singleInt();
};
它需要在lambda中处理重试,并且它很好地符合与数据库的所有交互都是事务性的这一事实


你可能想再仔细阅读一下这些文件;(使用lambdas的)这一策略可以追溯到数据库库的开始(lambdas是在java8中添加的;无可否认,那是十年前的事了)。

非常感谢