事务复习

>事务复习

事务是一步或几步的数据库操作序列(尤其是增删改)组成的逻辑执行单元,这系列操作要么全部执行,要么全部放弃。程序和事务是两个不同的概念。一般而言:一段程序中可能包含多个事务。

事务具有四个特性:

A(原子性:事务是应用中不可再分的逻辑执行体)

也就是说,事务里的多个操作不能分开,必须一起成功或失败;

C(一致性:事务的执行结果,必须使数据库从一个一致性状态变到另外一个一致性状态)

也就是说,事务前后数据库表里的数据 要符合约束(如之前唯一约束,之后还是)

I(隔离性:并发执行的事务之间不能看到对方的中间状态,并发执行的事务之间不能相互影响)

事务中 有 提交(确认)和 回滚(反悔)两个概念。再多线程的环境下,多个事务允许并行,但是事务不能读取其他事务操作过程中的数据,尤其是那些没有提交可能回滚的数据。

D(持久性:事务一旦提交,对数据库做出的任何改变,都要记录到永久的存储器中,通常是物理数据库)

事务里的所有操作,一旦提交,那么这些操作对于数据库的改变应该是永久的。简单理解:一旦提交就不能回滚了。

举例:张三和李四转500

>事务隔离级别

其中,在多线程环境下,最重要就是隔离性,

多线程下同时修改,会造成数据混乱,要隔离;

多线程下同时读取,没问题;

多线程下一个线程修改,一个线程读取,可能会造成

1.脏读(对未提交的数据进行读取,此时数据处于待定,可能提交也可能回滚;这是最严重的隔离问题)、

2.不可重复读(一个事务先后读取同一条记录,两次数据不同,也就是说数据在两次读取中间被其他事务修改)、

3.虚读/幻读(一个事务按相同的条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据);

其中2、3不是问题,只是在特殊的业务场景下。eg:银行员工做报表分析的时候。

#

隔离级别:

read uncommitted:读未提交.。不会有任何改善,什么隔离问题都会出现。

read committed:读已提交。可以防止脏读,但是2、3不能防止。

repeatable read:可以防止1、2问题,m'ysql可以防止12问题和部分三问题。默认是这个级别的。

serializable:串行化。 可以防止123 问题,但是数据库效率极低(只为一个线程服务)。

查看隔离级别

>hello事务

一个操作的手动提交和回滚:

事务的回滚(回滚后,所有的操作都失败):

>数据库复习

索引:

视图:

>hello 存储过程:

01.

02.

03.含有事务的存储过程

>hello 存储函数:

>hello 游标

>hello 触发器

>JDBC

>jdbc 核心接口

>预编译对象

区别:

使用:

结果集:结果集查询出的结果就是一个临时表,next()就是一个指针;

获取:

>使用JDBC调用存储过程

>使用JDBC调用事务

package com.qq.demo;

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

public class UseTransaction {
	/*
	 * JDBC的事务管理.
	 * JDBC里使用con对象 来管理事务.默认的, 连接中所有的sql操作都会自动提交.
	 * setAutocommit(false), 提交时 手动commit  一般情况下 异常就回滚 rollback
	 * 
	 */
	public static void main(String[] args) {
		Connection con = MyJDBCTool.getCon();
		PreparedStatement pstmt = null;
		try {
			con.setAutoCommit(false);//关闭自动提交
			//新增一个singer 
			String sql = "insert into tsinger (sname,sdisplay) values (?,?)";
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, "许嵩");
			pstmt.setString(2, "xuxuxuxu");
			int row = pstmt.executeUpdate();
			System.out.println(row+">>>>>>>>>>>第一次的");
			//xiugai 
			sql = "update tsinger set sdisplay=? where sname = ?";
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, "年少有为");
			pstmt.setString(2, "胡歌");
			int row2 = pstmt.executeUpdate();
			System.out.println(row2+">>>>>>>>>>>第二次的");
			//手动提交
			con.commit();
		} catch (SQLException e) {
			e.printStackTrace();// 正在开发时  这一行 追踪异常信息 到控制台
			System.out.println("回滚了!");
			try {
				con.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
		}finally {
			MyJDBCTool.closeALL(null, pstmt, con);
		}
	}
}

猜你喜欢

转载自blog.csdn.net/AhaQianxun/article/details/93939880