
事务
事务介绍:
就是一件事情,操作要不全部成功,要不全部失败。
mysql里的事务操作
通过一个命令(show variables like ‘autocommit‘;)
得到 autocommit=on;意思是事务 都自动提交
每一条sql都是一个事务
手动事务的操作:(☆)
start transaction; 开始事务(不管是否自动提交)
commit;提交事务
rollback;事务回滚
通过以下命令,可以设置事务为手动提交
set autocommit=off;
注意:一旦设置手动提交后,不要使用start transaction再开启事务了,这时开启的是新事务
java里的事务操作
Connection接口里面的方法:☆
void setAutoCommit(boolean autoCommet):设置事务是否自动提交
void commit():提交事务
void rollback():事务回滚
Savepoint setSavePoint():设置一个还原点
void rollback(savepoint):还原到哪个还原点
事务的特性:(☆)
ACID
原子性:atomicity 要么全部成功,要么全部失败
一致性:consistency 事务执行之后,状态与其它业务规则保持一致。例如:转账,总钱数不变
隔离性:isolation 在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。jsp sql传两个参数
持久性:durability 一旦事务提交或回滚后,必须持久化到中
隔离性:
若不考虑隔离性,会出现的问题:
脏读:读取到别的事务没有提交的数据
不可重复读:在一个事务中,两次查询的结果不一致(内容 update)
虚读(幻读):在一个事务中,两次查询的结果不一致(条数,针对insert delete操作)
的隔离级别:

read uncommitted:读未提交,最低的级别,上面的情况都可以发生
read committed:读已提交,可以避免脏读
repeatable read:可重复读,可以避免不可重复读
serializable:串行化,最高的等级,可以避免所有问题。
演示几种问题:
设置的隔离级别:
set session transactioin isolation level 级别;
查看当前的隔离级别:
select @@tx_isolation;
mysql默认的隔离级别:repeatable read☆
oracle扩展的隔离级别:read committed☆
安全性:
serializable>repeatable read>read committed>read uncommitted
效率:反之
案例:
转账案例
解决service层需要传入connection参数:
Map<Thread,Connection> map
第一次开始事务的时候,先获取map.get(Thread.currentThread()) == ThreadLocal.get()
获取一个connection,开启事务,最后map.put(Thread.currentThread(),connection) == ThreadLocal.set()
在dao层可以直接使用,map.get(Thread.currentThread())就可以获取绑定的链接
执行的流程:
account.jsp:接收用户信息
accountServlet:接收参数,调用service,页面的跳转
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-73105-1.html
现在我是不赞成买外国先进装备的
好好好
用户名输入时候键盘居然弹不出