【问题标题】:Are JDBI batch operation atomic?JDBI批处理操作是原子的吗?
【发布时间】:2014-09-19 11:12:18
【问题描述】:

JDBI 批处理操作(插入或更新)是原子的吗?还是我需要将它们包装在事务块中?

【问题讨论】:

    标签: java mysql database jdbi


    【解决方案1】:

    根据java docs,默认情况下它是事务性的。我不知道它是否符合原子的描述,但您不需要将它们包装在事务块中。 (仅供参考,如果你想在 DAO 级别上做一些事务性的事情,你可以使用 @Transaction 注释,这比事务块更好)

    【讨论】:

    【解决方案2】:

    我的测试表明 JDBI 批处理操作不是原子的。如果我们想要全有或全无操作,我们需要将批处理放入事务中。

    我创建了一个简单的测试示例。我使用了 InnoDB 的 MySQL 数据库 输入。

    package com.zetcode;
    
    import org.skife.jdbi.v2.Batch;
    import org.skife.jdbi.v2.DBI;
    import org.skife.jdbi.v2.Handle;
    
    public class JDBIEx6 {
    
        public static void main(String[] args) {
    
            DBI dbi = new DBI("jdbc:mysql://localhost:3306/testdb",
                    "testuser", "test623");
    
            Handle handle = dbi.open();
            Batch batch = handle.createBatch();
    
            batch.add("DROP TABLE IF EXISTS Friends");
            batch.add("CREATE TABLE Friends(Id INT AUTO_INCREMENT PRIMARY KEY, Name TEXT)");
            batch.add("INSERT INTO Friends(Name) VALUES ('Monika')");
            batch.add("INSERT INTO Friends(Name) VALUES ('Tom')");
            batch.add("INSERT INTO Friends(Name) VALUES ('Jane')");
            batch.add("INSERT INTO Friends(Name) VALUES ('Robert')");
    
            batch.execute();
        }
    }
    

    如果我们故意修改其中一个 INSERT 语句使其失败, 创建表并保存所有正确的 INSERT 语句。

    以下是项目的 Mavem POM 文件。

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.zetcode</groupId>
        <artifactId>JDBIEx6</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>jar</packaging>
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.jdbi</groupId>
                <artifactId>jdbi</artifactId>
                <version>2.73</version>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.39</version>
            </dependency>
    
        </dependencies>    
    </project>
    

    所以我质疑批处理操作在默认情况下是原子的这一事实。

    【讨论】:

    • 首先,非常感谢您对此进行测试!其次,您(或其他任何人)是否知道将批处理包装在事务中的方法?
    【解决方案3】:

    认为你不应该将 ddl 语句批量放在 mysql 上,请参阅http://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

    create table ... 之后有一个隐式提交,这几乎破坏了批处理周围的 MAY BE 事务。

    只是说...

    【讨论】:

      猜你喜欢
      • 2018-01-06
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      相关资源
      最近更新 更多