jOOQ - 事务语句

什么是事务?

事务是作为单个工作单元执行的一个或多个操作的序列。如果任何任务失败,事务就会失败。事务必须满足 ACID 属性,即 −

  • 原子性:事务是原子性的,这意味着要么所有操作都成功,要么所有操作都不成功。

  • 一致性:它确保在成功提交事务后,数据库正确地从一个状态转移到另一个状态。

  • 隔离性:事务彼此隔离。

  • 持久性:一旦提交事务,即使系统崩溃,更改也会持续存在。

事务操作

常见的事务操作是 −

  • BEGIN:要开始新的事务,请执行以下操作:事务。

  • COMMIT:使更改永久生效。

  • ROLLBACK:将撤消更改

jOOQ 中的事务语句

在 jOOQ 中,DSL 类的以下方法用于创建事务语句 −

SNo. 方法 &描述
1. transaction(Configuration)

此方法将多个数据库操作组合在一个事务块中。

2. setTransactionIsolation(intisolationLevel)

用于设置当前事务的隔离级别。

3. commit()

此方法用于提交当前事务。

4. rollback()

它将撤消在事务期间所做的任何更改。

事务语句示例jOOQ

在此示例中,我们将把 ALTER TABLE 操作和 INSERT 操作组合在一起。我们将使用下表执行此操作 −

Rank Name Job Title
1 Aman Technical Writer
2 Shriansh Software Engineer
4 Vivek Developer

首先在"src -> main -> java -> com.example.demo"中创建一个包。"com.example.demo"文件夹的名称取决于您的项目名称。在此包中创建一个 Java 类。我们将包命名为"service",将 Java 类命名为"EmployeeService.java"。您可以随意命名。

在 jOOQ 中,我们使用 alterTable() 方法修改表结构,使用 renameColumn() 方法重命名列。要将数据插入表中,我们使用 insertInto() 方法。将以下代码片段复制并粘贴到"EmployeeService.java"文件中。

package com.example.demo.service;

import org.jooq.*;
import org.jooq.Record;
import org.jooq.impl.DSL;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.sql.DataSource;

@Service
public class EmployeeService {

   private final DataSource dataSource;

   @Autowired
   public EmployeeService(DataSource dataSource) {
      this.dataSource = dataSource;
   }

   public void run() {
      // 使用 DataSource 创建 DSLContext
      DSLContext create = DSL.using(dataSource, SQLDialect.MYSQL);

      // Wrap the operations inside a transaction
      create.transaction(configuration -> {
         // 在事务上下文中创建 DSLContext
         DSLContext ctx = DSL.using(configuration);

         // 手动定义表和列
         Table<?> employee = DSL.table("employee");
         Field<Integer> id = DSL.field("id", Integer.class);
         Field<String> name = DSL.field("name", String.class);
         Field<String> jobTitle = DSL.field("job_title", String.class);
         // 将列 id 重命名为 rank
         ctx.alterTable("employee")
            .renameColumn("rank").to("id")
            .execute();

         // 在表中插入一条新的员工记录
         ctx.insertInto(employee, id, name, jobTitle)
            .values(3, "Ansh", "Software Engineer")
            .execute();

         // 从员工表中获取值
         Result<Record3<Integer, String, String>> result = ctx.select(id, name, jobTitle)
            .from(employee)
            .fetch();

         // 打印结果
         for (Record record : result) {
            Integer employeeId = record.get(id);
            String employeeName = record.get(name);
            String employeeJobTitle = record.get(jobTitle);

            System.out.println("ID: " + employeeId + ", Name: " + employeeName + ", Job Title: " + employeeJobTitle);
         }
      });
   }
}

现在,导航到"com.example.demo"文件夹中的"DemoApplication.java"文件。然后,编写以下代码−

package com.example.demo;

import com.example.demo.service.EmployeeService;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication implements CommandLineRunner {

   private final EmployeeService demoApplication;
      
   public DemoApplication(EmployeeService demoApplication) {
      this.demoApplication = demoApplication;
   }
      
   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
      
   @Override
   public void run(String... args) throws Exception {
      demoApplication.run();
   }
}

运行此代码时,它会将"Rank"列更改为"id",并且还会在指定的表中插入一行 −

ID: 1, Name: Aman, Job Title: Technical Writer
ID: 2, Name: Shriansh, Job Title: Software Engineer
ID: 3, Name: Ansh, Job Title: Software Engineer
ID: 4, Name: Vivek, Job Title: Developer