事务:
就是一件完整的事情,可以包含多个操作单元,这些单元要么全部成功,要么全部失败
例如:转账
包含转出操作和转入操作.(转钱成功——到对方账户;转钱失败——回到自己账户)
mysql中的事务:
mysql中事务默认是自动提交,一条sql语句就是一个事务.
开启手动事务方式
方式1:关闭自动事务.(了解)
setautocommit = off;
方式2:手动开启一个事务.(理解)
starttransaction;-- 开启一个事务
commit;--事务提交
rollback;--事务回滚
扩展:
oracle中事务默认是手动的,必须手动提交才可以.
java中的事务:
Connection接口的api:
setAutoCommit(false);//手动开启事务
commit():事务提交
rollback():事务回滚
扩展: Savepoint还原点
voidrollback(Savepoint savepoint) :还原到那个还原点
SavepointsetSavepoint() :设置还原点
1.向下传递
2.将连接绑定到当前线程
ThreadLocal
set(Objectvalue)
Objectget()
remove()
DBUtils中事务控制QueryRunner:
newQueryRunner(Datasource ds):
//自动事务.调用方法的不需要传入connection,资源不用我们释放.
new QueryRunner():
//手动事务.调用方法的必须传入connection,需要手动提交事务或者回滚事务.必须手动的释放资源
事务的特性:
ACID
1.原子性:事务里面的操作单元不可切割,要么全部成功,要么全部失败
2.一致性:事务执行前后,业务状态和其他业务状态保持一致.
3.隔离性:一个事务执行的时候最好不要受到其他事务的影响
4.持久性:一旦事务提交或者回滚.这个状态都要持久化到数据库中
不考虑隔离性会出现的读问题
1.脏读:在一个事务中读取到另一个事务没有提交的数据
2.不可重复读:在一个事务中,两次查询的结果不一致(针对的update操作)
3.虚读(幻读):在一个事务中,两次查询的结果不一致(针对的insert操作)
通过设置数据库的隔离级别来避免上面的问题
readuncommitte 读未提交 上面的三个问题都会出现
readcommitted 读已提交 可以避免脏读的发生
repeatableread 可重复读 可以避免脏读和不可重复读的发生
serializable 串行化 可以避免所有的问题
1.演示脏读的发生:
将数据库的隔离级别设置成读未提交
setsession transaction isolation level read uncommitted;
查看数据库的隔离级别
select@@tx_isolation;
2.避免脏读的发生,将隔离级别设置成 读已提交
setsession transaction isolation level read committed;
不可避免不可重复读的发生.
3.避免不可重复读的发生经隔离级别设置成可重复读
set session transaction isolationlevel repeatable read;
4.演示串行化可以避免所有的问题
setsession transaction isolation level serializable;
锁表的操作.
四种隔离级别的效率
readuncommitted>read committed>repeatable read>serializable
四种隔离级别的安全性
readuncommitted
开发中绝对不允许脏读发生.
mysql中默认级别:repeatable read
oracle中默认级别:read committed
Connection的api
voidsetTransactionIsolation(int level)
level是常量