随笔小站

记录生活的点点滴滴

Java数据库编程学习记录(三)

上次完成了数据库的连接以及简单的查询操作和返回结果操作,这次尝试进行事务控制的代码编写。

事务概念回顾

事务是数据库操作中必不可少的环节。它具有A、C、I、D四个特性:

  1. 原子性(Atomicity):事务最小的单元,不可再分割。一系列事务要么全部成功,要么全部失败;
  2. 一致性(Consistency):数据库操作的前后是完全一致的,操作成功维持状态,操作失败回滚到操作前状态;
  3. 隔离性(Isolation):多个事务同时进行,互不干扰;
  4. 持久性(Durablity):当事务成功提交后,是不可以回滚的。

实现范例

事先准备好的数据库

事先在数据库shop创建好的表good:

1
2
3
4
5
6
7
8
9
10
11
create table good (
gid varchar(10) not null,
sid varchar(10) not null references shop(sid),
cgid varchar(10) not null references categories(cgid),
gname varchar(20) not null,
count int,
price decimal(5,2),
primary key (gis, sid),
check (count >= 0),
check (price >= 0)
);

导入的数据:
导入的数据

实现代码

方法代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
* 实现事务控制
*
* @param ProName
* @param sql
*/
private static void insertData(String ProName, String sql) {
Connection conn = getConn(ProName);
Statement stmt = null;
try {
conn.setAutoCommit(false);// JDBC默认自动提交事务,这里进行关闭
stmt = conn.createStatement();
stmt.execute(sql);// 执行语句
conn.commit();// 提交事务
} catch (SQLException e) {
try {
conn.rollback(); // 出现异常进行回滚
} catch (SQLException e2) {
e2.printStackTrace();
}
e.printStackTrace();
} finally {
try {
// 关闭数据库
stmt.close();
conn.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}

主函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String[] args) {
//正确语句
String sql1 = "insert into good(gid, sid, cgid, gname, count, price) values"
+ "('G009', 'S003', 'CG006', '韭叶面', '45', '3.00')";
// 下面两个为错误语句
String sql2 = "insert into good(gid, sid, cgid, gname, count, price) values"
+ "('G009', 'S001', 'CG006', '韭叶面', '-1', '3.00')";
String sql3 = "insert into good(gid, sid, cgid, gname, count, price) values"
+ "('G003', 'S003', 'CG002', '番茄', '45', '-2')";
// 执行语句
insertData("shop", sql1);
insertData("shop", sql2);
insertData("shop", sql3);
}

返回结果

返回结果

左边显示sql1成功插入并提交,右侧代码显示sql2和sql3因为输入了错误数据被check检查出返回sql异常报错。

-------------本文结束感谢您的阅读-------------