为什么无法通过VB执行我的MySQL事务?

时间:2019-12-18 18:36:23

标签: mysql vb.net transactions

早上好, 如果有一些问题,我需要一个交易原因,我希望什么也不要创建,不要计划,什么也不做。 但是它总是写在我的数据库上,例如,在我的代码中,我没有将名称字段放在Insert中,但是它创建了方案和表,因此之前是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>

1 个答案:

答案 0 :(得分:1)

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

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

DML 语句视为按行操作。 INSERTUPDATEDELETE语句对行进行操作。这些操作可以在事务内执行,并且受ROLLBACKCOMMIT的约束。

DDL 语句视为按列操作。 CREATE TABLEALTER TABLE语句创建,修改或删除列。 (DDL语句不仅对表和列进行操作,但是出于讨论的目的,我们将重点关注按列操作与按行操作。DDL操作会导致隐式提交,因此不受事务ROLLBACK约束。 / p>

此行为并非MySQL独有。

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

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