数据库事务在并发控制中如何处理长尾请求导致的性能瓶颈问题?
- 内容介绍
- 文章标签
- 相关推荐
本文共计582个文字,预计阅读时间需要3分钟。
需要在`user_table`表中执行以下操作:将AA的账户金额减少1000,同时将BB的账户金额增加1000。这两个事务必须同时执行,要么都执行,要么都不执行。以下是一个简单的实现示例:
javapublic static void updateCustomer(String sql, Object... args) { Connection conn=null; PreparedStatement pstmt=null; try { // 假设conn是数据库连接 conn=DriverManager.getConnection(数据库URL, 用户名, 密码); conn.setAutoCommit(false); // 开启事务
pstmt=conn.prepareStatement(sql); for (int i=0; i
conn.commit(); // 提交事务 } catch (SQLException e) { if (conn !=null) { try { conn.rollback(); // 回滚事务 } catch (SQLException ex) { ex.printStackTrace(); } } e.printStackTrace(); } finally { try { if (pstmt !=null) pstmt.close(); if (conn !=null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } }}
需要实现在user_table表中AA给BB转账1000
AA.balance-1000同时BB.balance+1000
两个事情必须要么执行,要么不执行,这就是事务
没有加事务的做法:
public static void updateCustomer(String sql,Object... args){
Connection connection = null;
PreparedStatement ps = null;
try {
connection = JDBCUtils.getConnection();
ps = connection.prepareStatement(sql);
for(int i=0;i<args.length;i++){
ps.setObject(i+1,args[i]);
}
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(connection,ps);
}
}
@Test
public void test01(){
String sql1="update user_table set balance=balance-1000 WHERE `user`=?";
Common.updateCustomer(sql1,"AA");
System.out.println(10/0);
String sql2="update user_table set balance=balance+1000 WHERE `user`=?";
Common.updateCustomer(sql2,"BB");
System.out.println("转账成功");
}
考虑事务以后的代码实现update:
public static void updateCustomerTx(Connection connection,String sql,Object... args){
PreparedStatement ps = null;
try {
ps = connection.prepareStatement(sql);
for(int i=0;i<args.length;i++){
ps.setObject(i+1,args[i]);
}
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(null,ps);
}
}
@Test
public void test2() {
Connection connection=null;
try {
connection = JDBCUtils.getConnection();
System.out.println("连接的默认提交方式:" + connection.getAutoCommit());
connection.setAutoCommit(false);
String sql1 = "update user_table set balance=balance-1000 WHERE `user`=?";
Common.updateCustomerTx(connection, sql1, "AA");
System.out.println(10/0);
String sql2 = "update user_table set balance=balance+1000 WHERE `user`=?";
Common.updateCustomerTx(connection, sql2, "BB");
System.out.println("转账成功");
connection.commit();
} catch (Exception e) {
try {
connection.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally {
connection.setAutoCommit(false);
JDBCUtils.closeResource(connection,null);
}
}
本文共计582个文字,预计阅读时间需要3分钟。
需要在`user_table`表中执行以下操作:将AA的账户金额减少1000,同时将BB的账户金额增加1000。这两个事务必须同时执行,要么都执行,要么都不执行。以下是一个简单的实现示例:
javapublic static void updateCustomer(String sql, Object... args) { Connection conn=null; PreparedStatement pstmt=null; try { // 假设conn是数据库连接 conn=DriverManager.getConnection(数据库URL, 用户名, 密码); conn.setAutoCommit(false); // 开启事务
pstmt=conn.prepareStatement(sql); for (int i=0; i
conn.commit(); // 提交事务 } catch (SQLException e) { if (conn !=null) { try { conn.rollback(); // 回滚事务 } catch (SQLException ex) { ex.printStackTrace(); } } e.printStackTrace(); } finally { try { if (pstmt !=null) pstmt.close(); if (conn !=null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } }}
需要实现在user_table表中AA给BB转账1000
AA.balance-1000同时BB.balance+1000
两个事情必须要么执行,要么不执行,这就是事务
没有加事务的做法:
public static void updateCustomer(String sql,Object... args){
Connection connection = null;
PreparedStatement ps = null;
try {
connection = JDBCUtils.getConnection();
ps = connection.prepareStatement(sql);
for(int i=0;i<args.length;i++){
ps.setObject(i+1,args[i]);
}
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(connection,ps);
}
}
@Test
public void test01(){
String sql1="update user_table set balance=balance-1000 WHERE `user`=?";
Common.updateCustomer(sql1,"AA");
System.out.println(10/0);
String sql2="update user_table set balance=balance+1000 WHERE `user`=?";
Common.updateCustomer(sql2,"BB");
System.out.println("转账成功");
}
考虑事务以后的代码实现update:
public static void updateCustomerTx(Connection connection,String sql,Object... args){
PreparedStatement ps = null;
try {
ps = connection.prepareStatement(sql);
for(int i=0;i<args.length;i++){
ps.setObject(i+1,args[i]);
}
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(null,ps);
}
}
@Test
public void test2() {
Connection connection=null;
try {
connection = JDBCUtils.getConnection();
System.out.println("连接的默认提交方式:" + connection.getAutoCommit());
connection.setAutoCommit(false);
String sql1 = "update user_table set balance=balance-1000 WHERE `user`=?";
Common.updateCustomerTx(connection, sql1, "AA");
System.out.println(10/0);
String sql2 = "update user_table set balance=balance+1000 WHERE `user`=?";
Common.updateCustomerTx(connection, sql2, "BB");
System.out.println("转账成功");
connection.commit();
} catch (Exception e) {
try {
connection.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally {
connection.setAutoCommit(false);
JDBCUtils.closeResource(connection,null);
}
}

