SQL

1,概念

  • 一组要么同时执行成功,要么同时执行失败的SQL语句,是数据库操作的一个执行单元!

  • 事务开始于 1,连接到数据库上,并执行一条DML语句(INSERT,UPDATE,或DELETE) 2,前一个事务结束后,有输入了另外一条DML语句

  • 事务结束于 1,执行COMMIT或ROLLBACK语句 2,执行一条DDL语句。如:create table语句;这种情况下会自动执行commit语句。 3,执行一条DCL语句。如:grant语句;在这种情况下会执行commit语句。 4,断开与数据库的连接。 5,执行了一条DML语句,该语句却失败了;这种情况下,会认为这个无效的DML语句执行ROLLBACK语句。

2,事务的特性(ACID)

  • atomicity(原子性)。表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败。
  • consistency(一致性)。表示事务内有一个操作失败时,所有的更改过的数据必须回滚到修改前的状态。
  • isolation(隔离性)。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。
  • durability(持久性)。持久性事务完成之后,它对于系统的影响是永久性的。

3,事务隔离级别从低到高

  • 读取未提交
  • 读取已提交(默认这个)
  • 可重复读
  • 序列化

public class demoe {
	public static void main(String[] args) {
		Connection conn =null;
		PreparedStatement ps=null;
		PreparedStatement ps1=null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8","root","zzj234812");
			
			conn.setAutoCommit(false);//JDBC中默认自动提交事务
			
			ps=conn.prepareStatement("insert into stu_table (name,pwd) values(?,?)");
			ps.setObject(1, "张三丰");
			ps.setObject(2,"8888");
			ps.execute();
			System.out.println("插入一个用户,张三丰");
			
			try {
				Thread.sleep(6000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			ps1=conn.prepareStatement("insert into stu_table (name,pwd) values(?,?)");
			//ps1=conn.prepareStatement("insert into stu_table (name,pwd) values(?,?,?)");
			ps1.setObject(1, "与代言");
			ps1.setObject(2,"8888");
			ps1.execute();
			System.out.println("插入一个用户,与代言");
			
			conn.commit();//提交
		} catch (ClassNotFoundException e){
			e.printStackTrace();
			try {
				conn.rollback();//回滚
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} 
	}
}

执行结果如下:

插入一个用户,张三丰 插入一个用户,与代言

当我们换上这条语句时

ps1=conn.prepareStatement("insert into stu_table (name,pwd) values(?,?,?)");

结果只显示第一条语句执行成功,那么我们看数据库并没有数据,说明这两条SQL语句在同一个事务中,要么同时成功,要么同时失败。回滚到第一条SQL语句执行之前的状态 image.png

image.png