您的位置:首页 > 编程语言

JDBC学习第三站之使用 Transaction 编程

2014-07-23 16:05 369 查看

1 1 事务的四大特性

事务是具备以下特征(ACID) 的工作单元:

(1) 原子性

事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据

修改操作要么全部执行,要么完全不执行。

原子操作,也就是不可分割的操作,必须 一起成功一起失败。

(2) 一致性

事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。 这

种特性称为事务的一致性。 假如数据库的状态满足所有的完整性约束, 就说该数据库是一致

的。

(3) 分离性

分离性指并发的事务是相互隔离的。 即一个事务内部的操作及正在操作的数据必须封锁

起来,不被其它企图进行修改的事务看到。

(4) 持久性

持久性意味着当系统或介质发生故障时, 确保已提交事务的更新不能丢失。 即一旦一个

事务提交,DBMS 保证它对数据库中数据的改变应该是永久性的,耐得住任何系统故障。

持久性通过数据库备份和恢复来保证。

2 事务处理三步曲

connection.setAutoCommit(false); // 把自动提交关闭
/*。。。。。。。*/      //正常的 DB  操作
//若没一条正常的操作语句都成功了
connection.commit() // 主动提交
// 若有一条 SQL  语句失败了,自动回滚
connection.rollback() // 主动回滚


//完整的代码片段:

try {
con.setAutoCommit(false); //step ①  把自动提交关闭
Statement stm = con.createStatement();
stm.executeUpdate("insert into person(id, name, age) values(520, 'X-Man', 18)");
stm.executeUpdate("insert into Person(id, name, age) values(521, 'Super', 19)");
//step ②  正常的 DB  操作
con.commit(); //step ③  成功主动提交
} catch(SQLException e) {
try {
con.rollback();
} catch(Exception e) {
e.printStackTrace();
} //step ③  失败则主动回滚
}


3 C JDBC 事务及事务隔离级别

JDBC 事务并发产生的问题:

① 脏读(D D irty R R eads s ) 一个事务读取了另一个并行事务还未提交的数据。

② 不可重复读( Un Re peatable Read ) 一个事务再次读取之前的数据时,得到的数据不一

致,被另一个已提交的事务修改。

③ 幻读(Phantom Read ) 一个事务重新执行一个查询,返回的记录中包含了因为其它最

近提交的事务而产生的新记录。

为了避免以上三种情况的出现,则采用

事务隔离级别:

TRANSACTION_NONE 不使用事务

TRANSACTION_READ_UNCOMMITTED 可以读取未提交数据

TRANSACTION_READ_COMMITTED可以避免脏读,不能够读取没提交的数据,最常用的隔离级别 大部分数据库的默认隔离级别

TRANSACTION_REPEATABLE_READ 可以避免脏读,不可以重复读取

TRANSACTION_SERIALIZABLE 可以避免脏读,不可重复读取和幻读, (事务串行化)会降低数据库效率

以 上 的 五 个 事 务 隔 离 级 别 都 是 在 Connection 类 中 定 义 的 静 态 常 量 , 使 用

setTransactionIsolation(int level) 方法可以设置事务隔离级别。

比如 :
con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);


4 事务实例

package JDBC_Study;

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

public class TransactionDemo {

public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try {
// 动态导入数据库的驱动
Class.forName("com.mysql.jdbc.Driver");
// 获取数据库链接
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/jdbc_teaching", "root", "");
// 开启事务
conn.setAutoCommit(false);
// 创造SQL语句
String sql = "INSERT INTO user_list ( user_name, user_password )VALUES ( 'Eric', '123' )";
// 执行SQL语句
stmt = conn.createStatement();
stmt.executeUpdate(sql);
// 提交事务
conn.commit();
System.out.println("OK!");
} catch (Exception e) {
e.printStackTrace();
// 回滚事务
try {
conn.rollback();
} catch (Exception e2) {
}
} finally {
// 关闭Statement
try {
stmt.close();
} catch (Exception e) {
}
// 关闭Connection
try {
conn.close();
} catch (Exception e) {
}
}
}

}


如有总结的不妥的地方,记得留言让小弟也学习学习
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐