什么是事务
事务:是一组操作的集合:它是一个不可分割的工作单位事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败.
举个例子:在我们进行银行转账操作时,张山要向李四转帐1000元。
我们可以拆分为下面三个步骤:
- 查询张山的余额
- 进行余额的交换
- 到账李四账户
这是正常情况执行完毕,我们称这个过程为一次事务。
但在异常情况下,如果余额的交换期间,出来故障,那么“3.到账李四账户”这一过程也便不会执行了。同时“张山余额的扣款也会回滚,重新回到张山的账户中”。
便引出了事务的一个流程:开启事务,回滚事务, 提交事务。
下面我们到datagrip里来看看事务的具体操作表现。
事务操作
同样我们拿转账案例为例子。
-- 手动开启事务
-- set @@autocommit=0;
-- 1.查询张山余额
select *from account where name='张山';
-- 2.进行转账交换
update account set money=money-1000 where name='张山';
-- 3.到账李四账户查询
update account set money=money+1000 where name='李四';
select *from account where name='李四';
-- 提交事务
commit;
-- 回滚事务
rollback ;
事务的四大特性
- 原子性:事务是不可分割的最小操作单元,要么全部成功,要么全部失败
- 一致性:事务完成时,必须使得所有的数据都保持一致状态。
- 隔离性:数据库提供的隔离机制,保证事务不受外部并发操作影响的独立环境下运行
- 持久性:事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
并发事务问题:(要在多个事务开启的前提下)
- 脏读:一个事务读到另一个事务未提交的数据
- 不可重复读:一个事务先后读取同一条数据,但读取的数据不一样,称为不可重复读
- 幻读:一个事务按照条件查询事务时,没有对应数据,但在插入数据时,又发现这行数据已经存在,好像出现了幻影称为幻读。
事务隔离级别
- read uncommitted(读取未提交):最低的隔离级别,但性能最好。
- read committed(读取已提交)
- repeatable read(可重复读)
- serializable(可串行化)