事务是指一组操作,组成这组操作的功能,要不全都成功,要不全不成功.
产于事务
1.数据库本向是提供事务.
2.jdbc提供对事务的处理.
1.数据库中事务处理
mysql事务是自动提交的.-----默认情况,事务自动提交。一条sql语句是一个单独事务
oracle事务是手动提交.
start transaction
------开启事务
rollback
------回滚
commit
------提交事务
mysql可不可以设置提交方式?
show variables like '%commit%'; 查看提交方式
set autocommit=off/on; 关闭自动提交
演示
start transaction
rollback
commit使用
create table account(
id int primary key auto_increment,
name varchar(20),
money double
);
insert into account values(null,'aaa',1000);
insert into account values(null,'bbb',1000);
insert into account values(null,'ccc',1000);
aaa----bbb 汇款500块.
update account set money=money-500 where name='aaa'; 从aaa减去500.
update account set money=money+500 where name='bbbb'; 给bbb加上500.
事务处理操作
1.start transaction.
2.
update account set money=money-500 where name='aaa'; 从aaa减去500.
update account set money=money+500 where name='bbbb'; 给bbb加上500.
3.发现数据有问题
rollback
4.commit。
2.jdbc事务处理
在Connection中提供
setAutoCommit(boolean f) ---设置事务的提交方式.
rollback()
--------------事务回滚.
commit() ------------------事务提交.
这三个方法是jdbc中事务处理的三个方法
Savepoint 回滚点
con.setSavepoint();获取
回滚时 rollback(savepoint);
-----------------------------------------------------------------------
事务的特性(ACID)
1.原子性
2.一致性
3.隔离性
4.持久性
重点介绍事务隔离性
如果不考虑隔离性会引发的问题
1.脏读
一个事务读取到另一个事务的未提交数据.
A 转账 给B 100,未提交
B 查询账户多了100
A 回滚
B 查询账户那100不见了
2.不可重复读
两次读取的数据不一致.(强调是update操作,数据总条数不变)
将隔离级别设置成 Read committed.查看是否可以解决脏读问题.
演示不可重复读.
A 转账 给B 100,未提交
B 查询 金额没变
A 提交数据
B查询,发现金额多了100
两次读取到的数据不一致.出现了不可重复读.
3.虚读(幻读)
两次读取的数据不一致.(强调是insert操作,数据总条数改变)
事务的隔离级别
数据库中一共有四种隔离级别
1 Serializable:可避免脏读、不可重复读、虚读情况的发生。(串行化)
2 Repeatable read:可避免脏读、不可重复读情况的发生。(可重复读)不可以避免虚读
3 Read committed:可避免脏读情况发生(读已提交)
4 Read uncommitted:最低级别,以上情况均无法保证。(读未提交)
mysql默认的隔离级别是什么?怎样设置隔离级别?
mysql默认隔离级别是Repeatable read级别.
操作数据库内部隔离级别
set session transaction isolation level 设置事务隔离级别
select @@tx_isolation
查询当前事务隔离级别
set session transaction isolation level Repeatable read;
serializable会出现锁表情况。
安全性:serializable > repeatable read > read committed > read uncommitted
性能 :serializable < repeatable read < read committed < read uncommitted
数据库隔离级别:repeatable read
----------------------------------------------------------------------------
JDBC设置事务的隔离级别
在Connection接口中提供
setTransactionIsolation(int level)用来设置事物的隔离级别
以下是Connection提供的四个级别字段
Connection.TRANSACTION_READ_COMMITTED
Connection.TRANSACTION_READ_UNCOMMITTED
Connection.TRANSACTION_REPEATABLE_READ
Connection.TRANSACTION_SERIALIZABLE
事务的丢失败更新问题
什么是更新丢失
两个或多个事务更新同一行,但这些事务彼此之间都不知道其它事务进行的修改,
因此第二个更改覆盖了第一个修改
数据库采用什么样的机制解决更新丢失问题
1.悲观锁(永远会发生)
利用数据库中的内部锁机制(行级别锁)
分为
读锁(共享锁)
lock in share mode
可以在一行上添加多个
写锁(排它锁)
for update
只能有一个.
update 语句默认添加的是排它锁.
锁必须在事务中添加,如果commit,锁自动释放.
2.乐观锁(永远不会发生)
添加版本字段解决丢失更新问题
-----------------------------------------------------------------------
事务的特性(ACID)
重点介绍事务隔离性
----------------------------------------------------------------------------
JDBC设置事务的隔离级别
事务的丢失败更新问题