- 概念
- 开启一个事务
- 事务的并发问题
事务:一组sql语句 要么同时成功 要么同时失败
MyISAM存储引擎不支持事务 InnoDB存储引擎支持事务
事务的acid原则
- 原子性 atomicity :原子性是指事务是一个不可分割的工作单位,事务中的 *** 作要么都发生,要么都不发生。
- 一致性 consistency :事务必须使数据库从一个一致性状态变换到另外一-个一致性状态
- 隔离性 isolation :一个事务的执行不能被其他事务干扰,并发执行的各个事务之间不能互相干扰。
- 持久性 durability :事务一旦提交就是永久性的修改
事务的分类:隐式事务、显式事务
开启一个事务
第一步,开启事务
set autocommit=0; start transaction;
第二步,执行多条sql
第三步,提交事务或回滚
-- 提交 commit; -- 回滚 rollback;
事务的并发问题
当多个事务访问相同的数据,如果没有相应的隔离级别就会导致各种并发问题:
- 脏读:读取到了别人进行修改但还未提交的数据
- 不可重复读:在一次事务中,两次查询同一条数据,得到的结果不一样
- 幻读:在一次事务中,先查询一次数据表,然后其他人进行了一次新增,然后又查询一次 两次查询的结果不一样,与脏读的区别是幻读的侧重点在新增,而脏读的侧重点在修改。
上面这几种问题都可以通过设置事务的隔离级别,
Oracle只支持read commit和serializable两种隔离级别
而mysql支持四种
产生的问题:脏读、不可重复读、幻读
(oracle数据库默认)只允许事务读取其他事务提交了的变更
产生的问题:不可重复读、幻读
(MysQL默认)在当前事务持续期间,禁止其他事务对这个字段进行更新,确保多次读取的值相同。
产生的问题:幻读
数据库查询隔离级别︰
select @@tx_isolation;
数据库设置隔离级别∶
set global transaction isolation level 级别字符串;
第二个单词global表示设置全局隔离级别 也可以该为session表示设置当前连接的隔离级别
回滚点
-- 设置回滚点 savepoint 自定义一个名字; -- 回滚到某个回滚点 rollback to 自定义名字;
上面这两行语句一般都是搭配在一起使用的,一般都是在同一个事务中。例如:
set autocommit=0; start transaction; -- 第一条删除语句 delete from 表名 where 筛选条件; -- 设置回滚点 savepoint aaa; -- 第二条删除语句 delete from 表名 where 筛选条件; -- 回滚到上面aaa回滚点 rollback to aaa;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)