事务
是逻辑上一组操作,要么全都成功,要么全都失败.
事务特性
原子性:事务不可分割
一致性:事务执行的前后,数据完整性保持一致.
隔离性:一个事务执行的时候,不应该受到其他事务的打扰
持久性:一旦结束,数据就永久的保存到数据库
不考虑隔离性
1.脏读
脏读是指在一个事务处理过程里读取了另一个事务未提交的数据。
例如:
aaa转账给bbb,
update account set money=money-100 where name='aaa';
update account set money=money+100 where name='bbb';
bbb此时查询aaa已经成功转入;[另一个事务中]
回滚 [当前事务]
bbb再次查询发现钱少了一百;[另一个事务中]
2 不可重复读
不可重复读:一个事务中多次查询时结果不一样,这是由于在查询间隔,被另一个事务修改并提交了
aaa查询 select * from account where name='aaa';[当前事务]
update account set money=money-100 where name='aaa';[另一个事务中]
commit
aaa再次查询 select * from account where name='aaa';[当前事务]
两次结果不同
3.虚读(幻读)
幻读是事物中一种非独立的现象,幻读和不可重复读都是读取已提交的数据
区别在于:不可重复读是针对当个数据,而幻读是针对一批数据整体
例如:
系统管理员使用:update account set money=0 将所有的money置空
这时:ccc新增了一个用户,存入了一百并提交 insert into account(id,name,money) values(3,'ccc',1000);
系统管理员查询时发现有一行没有修改,就好像发生了幻觉一样
事务隔离级别
1.mysql存在四种隔离级别
1.Read uncommitted (读未提交):最低级别,任何情况都无法保证。
2.Read committed (读已提交):可避免脏读的发生。
3.Repeatable rea
4000
d (可重复读):可避免脏读、不可重复读的发生。【默认】
4.Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
2.oracle存在两种隔离级别
1 Read committed (读已提交):可避免脏读的发生。【默认】
2 Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
注:因为Oracle有undo,它天生就是读写不阻塞,因此在Oracle里,根本就不会出现脏读。
注:在事务中隔离级别越高,效率越低
3.修改事务
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]
例如:set transaction isolation level read committed;
阅读更多