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编程语言):
```javaimport 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的示例:
```javaimport 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