首页 > 解决方案 > 为什么我的 VB 中的 MySQL 事务不起作用?

问题描述

早上好,如果我有一些我想要的问题,我需要一个交易原因,不要创建任何东西,方案,表什么都没有。但它总是写在我的数据库上,例如在我的代码中,我没有将名称字段放在插入中,但它创建了方案和表,所以之前的 2 个命令。我哪里错了?谢谢

<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="MySql.Data" %>
<%@ Import Namespace="MySql.Data.MySqlClient" %>

<%RunTransaction("server=localhost;user id=root;password=xxx$;Database=ooo")%>

<script runat="server">

Public Sub RunTransaction(myConnString As String)
Dim myConnection As New MySqlConnection(myConnString)
myConnection.Open()

Dim myCommand As MySqlCommand = myConnection.CreateCommand()
Dim myTrans As MySqlTransaction

myTrans = myConnection.BeginTransaction()
myCommand.Connection = myConnection
myCommand.Transaction = myTrans

Try
    myCommand.CommandText = "CREATE SCHEMA xxx DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs;" 
    myCommand.ExecuteNonQuery()
    myCommand.CommandText = "CREATE TABLE xxx.ITEMIMG (IDITE VARCHAR(36) NOT NULL, IDIMG VARCHAR(36) NOT NULL, IMG VARCHAR(255) NULL, COVER INT NULL, DATINS DATE NULL, PRIMARY KEY (IDITE, IDIMG))"
    myCommand.ExecuteNonQuery()
    myCommand.CommandText = "INSERT INTO xxx.ITEMIMG (IDITE, , IMG, DATINS) VALUES ('maquillaje-1','maquillaje-1-img-1', '/maquillaje-1.jpg', NOW())"
    myCommand.ExecuteNonQuery()
    myTrans.Commit()

    response.write("Both records are written to database.")

Catch e As Exception

    myTrans.Rollback()
    response.write("rollaback")

Finally

    myConnection.Close()
    response.write("chidi connessione")

End Try
End Sub
</script>

标签: mysqlvb.nettransactions

解决方案


DDL语句导致隐式提交;不受交易控制。

除了 SELECT,SQL 语句属于两大类之一:DML(数据操作语言)和DDL(数据定义语言)

DML语句视为逐行操作。INSERT,UPDATEDELETE语句对行进行操作。这些操作可以在一个事务中执行,并且受制于ROLLBACKCOMMIT

DDL语句视为按列操作。CREATE TABLE, ALTER TABLE, 语句创建、修改或删除列。(DDL 语句不仅仅对表和列进行操作,但为了讨论的目的,我们将关注按列操作与按行操作。DDL 操作导致隐式提交,不受事务 ROLLBACK 的影响。

这种行为并不是 MySQL 独有的。

请注意,MySQL 8.0 中“原子 DDL”的引入并没有真正改变这一点。CREATE TABLE 语句要么成功并自动提交,要么失败。

https://dev.mysql.com/doc/refman/8.0/en/atomic-ddl.html


推荐阅读