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