关于mysql:MySQL-事务

9次阅读

共计 1205 个字符,预计需要花费 4 分钟才能阅读完成。

事务

事务个性

原子性(A)

事务要么全副胜利,要么全副失败,不会处于中间状态

一致性(C)

对数据有特定的预期状态,如非空,外键等等,这些更应该由应用层提供,数据库应该只用来保留数据而不解决具体逻辑

依据论文作者评论所说 C 只是为了使 ACID 更加顺口

隔离性(I)

并发执行的多个事务之间须要肯定的隔离级别来保证数据的正确性

持久性(D)

数据库须要保障事务一旦提交,就应该永恒保留到磁盘中

事务隔离级别

隔离级别越高,并行性能越低,从而导致性能降落

查看 MySQL 的默认隔离级别,能够看到 MySQL 默认隔离级别为:可反复读

mysql> show variables like 'transaction_isolation';
+-----------------------+-----------------+
| Variable_name         | Value           |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+

读未提交

当事务还没提交时,其所做的更改就会被其它事务看到,会导致 脏读(Dirty Read)

读提交

当一个事务提交后,所做批改才会被其它事务所看到

该隔离级别是大多数数据库默认的,如 Oracle, PostgreSQL, SQL Server 等

可反复读

在同一个事务执行过程中屡次读取同样记录的后果是一样的,会导致 幻读(Phantom Read)
当事务中须要应用 SELECT 语句查问,依据后果再更新数据就会导致更新谬误

如:给员工没工作时安顿新工作,当事务开始的时候查问到该员工须要安顿新工作,在执行 INSERT 操作安顿新工作时,别的事务在这个期间也安顿了新工作,就会导致工作安顿两份

MySQL 通过多版本并发管制(MVCC)技术解决了幻读问题,用于进步高并发下的吞吐性能

MVCC

通过保留某个工夫点的 快照 来实现的,InnoDB 的 MVCC 是通过在每行记录前面保留两个暗藏的列实现的,一个是 创立工夫 ,另一个是 删除工夫(存储的不是具体的工夫,而是零碎版本号,每次开启事务会主动递增)

串行化

对于某一行数据的 读取 批改 都会加锁,会重大影响性能

MySQL 采纳两阶段提交(2PL)来实现可串行化隔离

MySQL 事务启动形式

显示启动事务

beginstart transaction 配套的提交语句是 commit,回滚语句是 rollback。

set autocommit=0 这个命令会将这个线程的主动提交关掉。意味着如果你只执行一个 select 语句,这个事务就启动了,而且并不会主动提交。这个事务继续存在直到你被动执行 commitrollback 语句,或者断开连接。

能够通过 select * from information_schema.INNODB_TRX; 查问以后数据库的所有事务

正文完
 0