JDBC_事务概念_ACID特点_隔离级别_提交commit_回滚rollback

事务基本概念

-一组要么同时执行成功,要么同时执行失败的SQL语句。是数据库操作的一个执行单元!
一事务开始于:
·连接到数据库上,并执行一条DML语句(INSERT、 UPDATE或DELETE).·前一个事务结束后,又输入了另外一条DML语句。
-事务结束于:
·执行COMMIT或ROLLBACK语句。
·执行一条DDL语句,例如CREATE TABLE语句;在这种情况下,会自动热行COMMIT语句。
·执行一条DCL语句,例按如GRANT语句;在这种情况下,会自动执行COMMIT语句。
·断开与数据库的连接。
·执行了一条DML语句,该语句却失败了;在这种情况中,会为这个无效的DML语句执行ROLLBACK语句

·事务的四大特点(ACID )

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

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class Demo04 {
	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);
			ps1=conn.prepareStatement("insert into t_user(username,pwd)values(?,?)");
			ps1.setObject(1, "lzy");
			ps1.setObject(2, "123456");
			ps1.execute();
			
			try {
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			ps2=conn.prepareStatement("insert into t_user (username,pwd) values (?,?,?)");
			ps2.setObject(1, "lzy2");
			ps2.setObject(2, "123456");
			ps2.execute();
			conn.commit();//手动提交事务
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			
			try {
				conn.rollback();
				System.out.println("回滚事务");
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			
				
			
			
		}

	}
}

如果要进行回滚事务(rollback()),一定要改为手动提交事务

conn.setAutoCommit(false);//手动提交事务
ps2=conn.prepareStatement("insert into t_user (username,pwd) values (?,?,?)");
			ps2.setObject(1, "lzy2");
			ps2.setObject(2, "123456");
			ps2.execute();

该代码中插入语句有三个占位符,而我只设置了两个内容,所以会报错,使用了回滚事务后,第一条插入的lzy1也会失败,也就是说数据库没有发生变化,也就符合事务的基本概念:一组要么同时执行成功,要么同时执行失败的SQL语句。是数据库操作的一个执行单元!

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字50 设计师:CSDN官方博客 返回首页