package 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;
/*
* 事务简单来说就是一组要么同时执行成功要么同时执行失败的SQL语句,是数据库操作的一个执行单元
* 事务开始于:DML语句,也就是insert,update或着delete这些语句;查询的select不属于事务开始
* 前一个事务结束后,有输入了另一条DML语句
*
* 事务结束于:COMMIT或ROLLBACK语句:提交或回滚到未执行前的状态
* 执行一条DDL语句:例如创建一张表,此时自动提交
* 执行一条DCL语句:权限操作,此时自动提交
* 断开数据库连接
* 执行了一条DML语句,结果语句却失败了
*
* 事务的四大特性:1.原子性(ctomicity):表示一个事务内的所有操作是一个整体,要么全部成功,要么全失败
* 2.一致性(consistency):一个事务内有一个操作失败时,所有的更改过的数据必须回滚到修改前的状态
* 3.隔离性(isolation):事务查看数据时,数据所在的状态要么是另一并发事务修改它之前的状态,
* 要么是另一事务修改它之后的状态,事务不会查看中间状态的数据
* 4.持久性(durability):持久性事务完成之后,它对于系统的影响是永久性的
*
* 事务隔离级别从低到高:(效率与隔离级别相反,一般用前两个,默认都用第二个,后两个效率太低了)
* 1.读取未提交(2个事务同时进行时,a事务如果处于这个级别,那么a事务还么提交b事务就可以看到),
* 2.读取已提交(2个事务同时进行时,a事务如果处于这个级别,那么a事务提交之后b事务才可以看到),
* 3.可重复读,
* 4.序列化(锁表)
*
*/
public class Demo_main {
public static void main(String[] args){
PreparedStatement ps1 = null;
PreparedStatement ps2 = null;
Connection c = null;
try {
//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
//建立连接
c = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc的使用","root","root");
//关闭自动提交
c.setAutoCommit(false);//JDBC默认自动提交
//执行SQL语句
ps1 = c.prepareStatement("insert into student(name,age) values(?,?)");
ps1.setObject(1, "张三");
ps1.setObject(2, 18);
ps1.execute();
System.out.println("正确的数据");
try {
Thread.sleep(6000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ps2 = c.prepareStatement("insert into student(name,age) values(?,?,?)");
ps2.setObject(1, "李四");
ps2.setObject(2, 19);
ps2.execute();
System.out.println("错误的数据");
//手动提交
c.commit();
//因为第二条语句是错误的,多了一个"?"占位符
//在我们捕获异常后回执行回滚操作,返回事务开始之前,导致第一条正确的语句也会无效
} catch (ClassNotFoundException e) {
e.printStackTrace();
try {
c.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(ps2 != null) {
ps2.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(c != null) {
c.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}