事务
事务个性
原子性(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 事务启动形式
显示启动事务
begin
或 start transaction
配套的提交语句是 commit,回滚语句是 rollback。
set autocommit=0
这个命令会将这个线程的主动提交关掉。意味着如果你只执行一个 select 语句,这个事务就启动了,而且并不会主动提交。这个事务继续存在直到你被动执行 commit
或 rollback
语句,或者断开连接。
能够通过 select * from information_schema.INNODB_TRX;
查问以后数据库的所有事务