MySQL连接类型下的事务处理(mysql不同连接的事务)

MySQL连接类型下的事务处理

在MySQL中,连接类型是指客户端应用程序和数据库服务器之间的连接方式。MySQL支持多个连接类型,包括本地连接、TCP/IP连接、Web连接和SSL连接等。根据连接类型的不同,事务处理的方式也有其特定的规则和要求。

本地连接事务处理

本地连接是指应用程序与MySQL数据库在同一台计算机上运行。在这种连接类型下,事务处理非常简单。应用程序调用MySQL的事务处理命令(BEGIN、COMMIT或ROLLBACK)即可进行事务操作。

以下是一个本地连接的示例(使用Python编程语言):

“`python

import mysql.connector

# 连接到本地MySQL数据库

mydb = mysql.connector.connect(

host=”localhost”,

user=”root”,

password=”password”,

database=”mydatabase”

)

# 创建游标对象

mycursor = mydb.cursor()

# 开始事务

mycursor.execute(“BEGIN”)

# 执行SQL语句

sql = “INSERT INTO customers (name, address) VALUES (%s, %s)”

val = (“John”, “Highway 21”)

mycursor.execute(sql, val)

# 提交事务

mydb.commit()


TCP/IP连接事务处理

在TCP/IP连接下,事务处理的过程与本地连接类似。应用程序需要调用MySQL的事务处理命令,然后利用socket建立TCP/IP连接到服务器,执行SQL语句,提交/回滚事务。

以下是一个TCP/IP连接的示例(使用Java编程语言):

```java
import java.sql.*;
public class JdbcTest {
static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost/mydatabase";

static final String USER = "root";
static final String PASS = "password";
public static void mn(String[] args) {
Connection conn = null;
Statement stmt = null;
try {
// 注册 JDBC 驱动
Class.forName(JDBC_DRIVER);
// 打开连接
System.out.println("连接数据库...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);

// 开始事务
conn.setAutoCommit(false);
// 执行查询
System.out.println("插入数据...");
stmt = conn.createStatement();
String sql = "INSERT INTO customers (name, address) VALUES ('John', 'Highway 21')";
stmt.executeUpdate(sql);

// 提交事务
conn.commit();
System.out.println("插入完成...");

// 关闭资源
stmt.close();
conn.close();
} catch(SQLException se) {
// 回滚事务
if(conn != null) {
try {
System.err.print("回滚事务...");
conn.rollback();
} catch(SQLException excep) {
excep.printStackTrace();
}
}

// 处理 JDBC 错误
se.printStackTrace();
} catch(Exception e) {
// 处理 Class.forName 错误
e.printStackTrace();
} finally {
// 关闭资源
try {
if(stmt!=null) stmt.close();
} catch(SQLException se2) {
}
try {
if(conn!=null) conn.close();
} catch(SQLException se) {
se.printStackTrace();
}
}
System.out.println("Goodbye!");
}
}

Web连接事务处理

当应用程序通过Web服务器与MySQL数据库连接时,需要考虑Web服务器和MySQL服务器之间的网络通信问题。在这种情况下,应用程序通常使用MySQL提供的Java Servlet或JSP技术来访问数据库,这将导致特定的连接类型和事务处理方式。

以下是一个采用Servlet连接MySQL的示例:

“`java

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.sql.*;

public class InsertCustomer extends HttpServlet {

public void doPost(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException {

response.setContentType(“text/html”);

PrintWriter out = response.getWriter();

Connection conn = null;

PreparedStatement stmt = null;

String customerName = request.getParameter(“customerName”);

String customerAddress = request.getParameter(“customerAddress”);

try {

// 加载驱动程序

Class.forName(“com.mysql.cj.jdbc.Driver”);

// 建立连接

conn = DriverManager.getConnection(“jdbc:mysql://localhost/mydatabase”, “root”, “password”);

// 开始事务

conn.setAutoCommit(false);

// 执行插入操作

String sql = “INSERT INTO customers (name, address) VALUES (?, ?)”;

stmt = conn.prepareStatement(sql);

stmt.setString(1, customerName);

stmt.setString(2, customerAddress);

stmt.executeUpdate();

// 提交事务

conn.commit();

out.println(“

插入成功!

“);

} catch (SQLException e) {

// 回滚事务

if (conn != null) {

try {

System.out.println(“回滚事务…”);

conn.rollback();

} catch(SQLException excep) {

excep.printStackTrace();

}

}

// 显示错误信息

out.println(“

插入失败!

" + e.getMessage() + "

“);

} catch (Exception e) {

e.printStackTrace();

} finally {

// 关闭连接和语句对象

try {

if (stmt != null) stmt.close();

if (conn != null) conn.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

}


SSL连接事务处理

当应用程序使用SSL协议来安全地访问MySQL数据库时,需要使用SSL连接。SSL连接与TCP/IP连接非常相似,但需要建立一个安全的socket连接,以保护数据传输。

以下是一个使用Java连接SSL MySQL的示例:

```java
import java.sql.*;
import java.util.Properties;
import javax.net.ssl.*;
public class SSLTest {

public static void mn(String args[]) {

Properties props = new Properties();
props.setProperty("user", "root");
props.setProperty("password", "password");
props.setProperty("useSSL", "true");
props.setProperty("sslMode", "VERIFY_IDENTITY");
props.setProperty("trustCertificateKeyStoreUrl", "file:///path/to/cacert.pem");
props.setProperty("trustCertificateKeyStorePassword", "");

String url = "jdbc:mysql://localhost:3306/mydatabase";

try {
Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
SSLSocketFactory socketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) socketFactory.createSocket("localhost", 3306);
socket.setEnabledCipherSuites(socket.getSupportedCipherSuites());
System.out.println("Connected to database via SSL...");
Connection conn = DriverManager.getConnection(url, props);
conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
String sql = "INSERT INTO customers (name, address) VALUES ('John', 'Highway 21')";
stmt.executeUpdate(sql);
conn.commit();
stmt.close();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}

参考文献:

1. MySQL Transactions – w3schools.com

2. MySQL Connector/J Developer Guide – Oracle.com


数据运维技术 » MySQL连接类型下的事务处理(mysql不同连接的事务)