JDBC中事务的操作
所谓的事务,就是我们在做一些事情的时候,要么同时成功,要么同时失败。这就是事务。
可以举一个简单的例子。比如说,我们在ATM中存钱的时候,如果我们存钱成功了。那么在银行系统的日志Log中就会打印存钱成功的消息。但是,如果我们存钱失败了得话,那么
银行系统的日志Log中就会打印存钱不成功的消息,或者不打印消息。也就是说,这俩者是同时成功或者说是同时失败的。不会出现一方成功但是另外一方失败的情况。
事务起始于DML语句。比如说是INSERT,UPDATE,或者说是DELETE语句。也就是说,如果有一组的SQL语句。那么当遇到这些类型的SQL语句的时候,那么事务就会开始执行了。这就是事务的开始。
那么事务什么时候结束呢?我们来看一下最后的一种情况。比如说,我们有一组SQL语句。并且事务开始了。如果在这一组的SQL语句中,有一条的SQL语句失败了。那么就会roolBack.也就是说,所有的SQL语句都没有执行成功,回到原来的状态。
我们来看一下事务的四大特征。一个原子性:也就是所有的事务中的SQL语句,要么同时
成功,要么同时失败。这就是原子性。
一致性:如果事务内有一个操作失败了,那么在事务中所有已经更改过的数据全部都回到 修改以前的状态。
隔离性:是指对于一个表,如果有A事务和B事务地对它进行修改。那么事务不会查看中间的状态。
持久性:也就是说,事务完成了以后,它对于系统的影响是永久性的。
事务的级别:所谓的读取未提交:是指一个事务在还没有commit的时候,另外的一个事务
就可以看到状态。
读取已提交:是指一个事务在已经ccommit的时候,另外的一个事务才能够看到修改后的状态。系统一般默认的也是这种状态。
序列化:其实也就是对事务进行加锁。
从上往下,效率越来越低。
最后我们来看一些例子:
package com.bjsxt.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 测试事务的基本概念和用法
* @author 高淇 www.sxt.cn
*
*/
public class Demo06 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps1 = null;
PreparedStatement ps2 = null;
try {
//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456");
conn.setAutoCommit(false); //JDBC中默认是true,自动提交事务
ps1 = conn.prepareStatement("insert into t_user (username,pwd) values (?,?)");
ps1.setObject(1, "高淇");
ps1.setObject(2, "123456");
ps1.execute();
System.out.println("插入一个用户,高淇");
try {
Thread.sleep(6000);
} catch (InterruptedException e) {
e.printStackTrace();
}
/*在这里的话,("insert into t_user (username,pwd) values (?,?,?)")
这条SQL语句是有错误的。应该只有俩个?。那么由于这些SQL语句都是处于一个事务
中的。那么因为这个SQL语句是有错误的。那么就相当于事务中的所有的SQL语句都没有执行。所有数据库的表中是没有任何变化的。这是要注意的。*/
ps2 = conn.prepareStatement("insert into t_user (username,pwd) values (?,?,?)");
ps2.setObject(1, "马士兵");
ps2.setObject(2, "123456");
ps2.execute();
System.out.println("插入一个用户,马士兵");
conn.commit();
} catch (ClassNotFoundException e) {
e.printStackTrace();
try {
conn.rollback(); //回滚
} catch (SQLException e1) {
e1.printStackTrace();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(ps1!=null){
ps1.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}