>事务复习
事务是一步或几步的数据库操作序列(尤其是增删改)组成的逻辑执行单元,这系列操作要么全部执行,要么全部放弃。程序和事务是两个不同的概念。一般而言:一段程序中可能包含多个事务。
事务具有四个特性:
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);
}
}
}