mysql 事务

事务其实是一组DML(inset delete update)语句的集合,MySQL 数据库 innodb 数据引擎支持事务。myisam 不支持。而且mysql的事务 默认是自提交的,如果开启事务 必须使用begin命令开始使用commit 或者rollback结束

事务的四大特性

1)原子性

事务的原子性是指事物中包含的所有操作,要么全部成功,要么全部回滚,保证数据库是一致的。

2)一致性

一致性是指数据库中的数据再事务操作前后必须都满足业务的规则约束。

3)隔离性

事务和事务之前是相互隔离的

4)持久性

数据库数据一旦修改就是永久的,即便数据库发生故障也不会丢失

事务的隔离级别

mysql有四种事务的隔离级别,用来限定事务内外的哪些改变是可见的哪些是不可见的,低的事务级别会支持更高的并发,并且拥有较低的系统开销。 mysql 通过show variables like '%tx_isolation%' 命令来查看当前数据库的隔离级别

可以通过setgloabal|session  transaction level 命令修改全局或者当前会话的事务隔离级别

1)读未提交(read uncommitted)简称 RU  在其中的一个事务中,可以读取到其他事务未提交的修改,这种读取被称为 脏读, 生产环境不建议使用(会产生脏读)

2)读已提交(read committed)简称RC  在一个事务中可以读取到其他事务已经提交的修改 这种读取 被称为不可重复读,允许幻读的现象的发生,是oracle 的数据库的默认隔离级别(会产生幻读,和不可重复读)

3)可重复度(repetable read)简称RR  mysql 的默认隔离级别  在一个事务中,可以一直读到事务开始之前的数据,并且数据保持一致,不会发生变化,避免了 脏读,不可重复读,和幻读的产生。(生产环境建议使用)

4) 串行(serializable) 在每一读的数据行上都加上表级共享锁,在每次写都加上表级排他锁,会造成innoDB 数据引擎的 并发能力下降,大量的锁竞争现象。

问:脏读,幻读,不可重复度,重复度 都是什么?

1)脏读: 脏读是 在当前事务中读取到了 另外一个事务未提交的修改;

比如:a事务新增数据 name=‘aaa’的数据      当a事务新增完成,但是还没有提交的时候  b事务去查询name=‘aaa’ 的数据 查询到了 新增的这条数据, 这就是 脏读

2)幻读: a事务中处理了多条sql  刚开始读取到A表中的 name=1 的数据有三条  此时b事务 新增了一条name=1 的数据 并且提交完成, a事务再次读取 name=1 的数据时 成为了4条数据, 这就产生了幻读,也就是读取到了别的事务 提交的修改。同时和刚开始读的数据不同 所以也就是不可重复度

3)可重复度

事务开始之后 读取到name=1 的数据为3条  在事务结束之前 再次读取的话 还是相同的数据 不会进行改变  这就是可重复度 同时避免了脏读 幻读。

你可能感兴趣的:(mysql 事务)