您的位置:首页 > 数据库

jdbc事务处理

2017-05-26 20:12 267 查看
为了保证数据的一致性、完整性

比如100条数据,插入数据库

前50条成功插入,后面50没有成功插入,这就属于不完整数据

所以我们要用事务管理来解决

//      设置为false,就不会自动提交到数据库,比如前50条数据通过,后面50不通过,这样也不会进入数据库
conn.setAutoCommit(false);

但是,使用conn.setAutoCommit(false);要注意数据库死锁

所以
(设定setAutoCommit(false)没有在catch中进行Connection的rollBack操作,操作的表就会被锁住,造成数据库死锁):
try {
conn = getConnection();
conn.setAutoCommit(false);

insertUserData(conn);
insertAddressData(conn);

conn.commit();
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("=====捕获到sql异常======");
e.printStackTrace();
try {
conn.rollback();
System.out.println("======事务回滚成功=====");
} catch (Exception e2) {
// TODO: handle exception
e2.printStackTrace();
}
注意:
setAutoCommit在try里面
conn.rollback();一定要在catch里面
//  conn.rollback();是数据回滚,是数据库中事物的执行,有一条插入失败,所有的都不插入,数据库回滚到操作之前的样子


代码

package com.chenzebin.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class TransactionTest {

public static Connection getConnection() {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jsp_db", "root", "");

} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return conn;
}

public static void insertUserData(Connection conn) throws SQLException {

String sql = "insert into tbl_user(id,name,password,email)" + "values(10,'Tom','123456','tom@gmail.com')";
Statement st = conn.createStatement();
int count = st.executeUpdate(sql);
System.out.println("向用户表插入" + count + "条记录");

}

public static void insertAddressData(Connection conn) throws SQLException {
String sql = "insert into tbl_address(id,city,country,user_id)" + "values(1,'shanghai','china','10')";
Statement st = conn.createStatement();
int count = st.executeUpdate(sql);
System.out.println("向地址表中插入了" + count + "条记录");

}

public static void main(String[] args) {
Connection conn = null;
try {
conn = getConnection();
conn.setAutoCommit(false);

insertUserData(conn);
insertAddressData(conn);

conn.commit();
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("=====捕获到sql异常======");
e.printStackTrace();
try {
conn.rollback();
System.out.println("======事务回滚成功=====");
} catch (Exception e2) {
// TODO: handle exception
e2.printStackTrace();
}
}finally {
try {
if(conn != null) {
conn.close();
}
} catch (Exception e3) {
// TODO: handle exception
e3.printStackTrace();
}
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息