一.事务的四大特性
事务:
由一组DML操作组成,要么同时成功,要么同时失败。
.MySQL默认的开启事务自动提交(autocommit)
MySQL默认将每个DML看作是独立的事务
1.原子性
整体操作不可分割
2.一致性
事务执行前后整体状态不变。
3.隔离性
并发事务之间不能产生干扰。
4.持久性
事务提交之后数据将持久化存储。
事务自动提交:
-- 查看是否开启了数据库事务
show variables like '%autocommit%';
-- 关闭事务自动提交
set autocommit=0;
-- 开启事务
start transaction/begin;
-- 提交事务
commit;
--事务回滚
rollback;
二.并发事务产生的问题
脏读: t1读到t2未提交的数据。
不可重复读: t1在多次读取范围内读到数据不一致问题。原因:t2在t1读取间隔内对数据进行修改并
提交了事务。
幻读(虚读): t1在多次操作读取范围内发现数据不一致问题。 原因:t2在操作范围内,由t1对数据
进行增删等操作,导致t2发现操作未完成,出现数据增加或减少。
三.事务的隔离级别
1.读未提交
即读到别人还没有进行提交的数据,即会产生脏读,不可重复读和幻读
解决方案:无法解决 (不设置)
2.读已提交
会产生不可重复读和幻读
解决脏读问题 (Oracle默认使用,对于不可重复读的解决方案是undo)
3.可重复读
会产生幻读
解决脏读和不可重复读(MySQL默认)
4.串行化
解决所有问题,但是相对来说效率是最低的。
查看事务的隔离级别:
select @@tx_isolation;
设置事务提交隔离级别:
set [glogal | session] transaction isolation level 隔离级别名称;
事务隔离级别名称:
Serializable (串行化)
Repeatable read (可重复读)
Read committed (读已提交)
Read uncommitted (读未提交)