1:数据库事务
1:数据库事务的介绍
事务就是一个逻辑单位,内部包含了有限的数据库crud 操作;
这些crud操作必须完整的执行,要么执行成功,要么执行不成功,失败回滚到原来
的数据状态
2:什么情况下需添加事务呢?
crud过程中有两个及以上的数据库操作是需要添加
3:事务的作用
1:保证数据的完整性,失败后可以恢复到原来状态
2:事务与事务之间互不干扰,这样数据会更加安全
4:数据库事务的基本使用
mysql--> dbms-->数据库事务自动提交
一个crud事务就是一个事务,当有一个操作是会自动提交事务,提交后的数据持久改变,
刻入磁盘,当发生异常,设置回滚,数据库就不会有所改变
没有异常 commit
抛出异常 rollback
5:普通话:
方法一:
start transaction
crud...
commit/rollback
方法二:
show variables like '%autocommit%'
set autocommit = off;
crud...
commit/rollback
6:jdbc-java:
注册驱动:
Class.forName(xxx.xxx.xxx);
获取连接:
DriverManager.getConnection();
创建语句:
Statement
结果集:
resultSet
设置非自动提交
connection.setAutoCommit(false);
7:利用try catch 实现事务
利用try{
connection.setAutoCommit(false);
crud...(两条以上);
connection.commit();
}catch{
connection.rollback();
}
8:事务的acid特性
a:Atomicity(原子性) 职务作为一个整体被执行,包含在其中的操作要么都成功,要么都失败。
c:Consistency(一致性):数据库事务应该保证数据从一个状态到另一个状态应该保证数据的一致性
i:Isolation(隔离性):并发事务互不干扰,
d:Durability(持久性):已经提交事务事务数据在数据库中长久保存。
9:基于事务的转账练习
mysql+c3p0+dbutils+事务+转账
方案:
1:liyong service 创建connection保证使用了同一个连接
2:每一次的请求都是同一个线程
ThreadLocal 同一个线程
10:隔离级别:
read uncommited(脏读)问题: 读取未提交数据 不可重复读 幻读
read commited 读取已经提交的数据 问题:发生不可重复读 幻读
repeatable read 重复读 避免脏读,不可重复度 及小的概率发生幻读
serializable: 串行化 同时只能有一个事务工作,其余事务等待 不会出现错误 但是效率极低
11:总结
隔离级别越高,事务之间的隔离性越强,安全性越高,但是效率越低
隔离级别越低,事务之间的隔离性越低,安全性越低,但是效率越高。
脏读:一个事务读取了另一个事务的未提交的数据! 错误! 避免! read uncommitted
不可重复读:一个事务读取了另一个事务提交的修改的数据! read uncommitted read committed
幻读/虚读:一个事务读取了另一个事务提交的插入数据! read uncommitted read committed repeatable read
有极小的可能会发生!
12:隔离级别的语法
1:查看
select @@tx_isolation;
2:设置
set transaction isolation leval 级别;
3:jdbc设置隔离级别
connection.setTransactionIsolation(1|2|4|8);