mysql 事务
ACID
• Atomic,同一个事务里,要么都提交,要么都回滚 --redo log/undo log
• Consistency,即在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏 --undo log
• Isolation,并发事务间的数据是彼此隔离的 --lock
• Durabiliy,事务提交后,所有结果务必被持久化 --redo log
• 支持事务:InnoDB、NDBCluster、TokuDB
• 不支持事务:MyISAM、MEMORY
1、隔离性通过锁实现
2、原子性、一致性、持久性通过数据库的redo和undo来完成
1.什么是MVCC?有什么作用?
MVCC(multi version concurrency control),多版本并发控制,用来对innodb引擎实现一致性的非锁定行读,读取
当前执行时间数据库中行的数据,如果读取的行正在执行delete,update操作,这时读取操作不会等待行锁,innodb
会读取行的一个快照数据(select不会等待锁的释放),快照数据是指该行之前版本的数据(之前版本指事务开始前
的版本?),通过undo段来实现。大大提高了数据读取的并发性。对于不同的事务隔离级别,快照的定义不一样。
3.2PC在数据库中是怎么来实现的?
innodb引擎支持分布式事务,通过2pc(两段式提交)来完成。
一个或多个资源管理器,一个事务管理器以及一个应用程序组成。
第一阶段:所有参与全局事务的节点都开始准备prepare,告诉事务管理器他们准备好提交
第二阶段:事务管理器告诉资源管理器执行rollback还是commit,如果任何一个节点显示不能提交,则所有的节点
都要被告知被回滚。
当前java的JTA可以很好的支持mysql的分布式事务。
参数innodb_support_xa可以查看是否启用了XA事务支持。mysql对XA的支持,是在存储引擎层。
mysql> show variables like 'innodb_support_xa';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| innodb_support_xa | ON |
+-------------------+-------+
autocommit = 0|1
显式事务 启动|结束
1、以START TRANSACTION/BEGIN开始事务
2、以 COMMIT/ROLLBACK TRANSACTION结束事务
隐性事务提交
主要是DDL、DCL会引发事务的隐性提交
DDL语句
1. ALTER FUNCTION
2. ALTER PROCEDURE
3. ALTER TABLE
4. BEGIN
5. CREATE DATABASE
6. CREATE FUNCTION
7. CREATE INDEX
8. CREATE PROCEDURE
9. CREATE TABLE
10. DROP DATABASE
11. DROP FUNCTION
12. DROP INDEX
13. DROP PROCEDURE
14. DROP TABLE
15. UNLOCK TABLES
16. LOAD MASTER DATA
17. LOCK TABLES
18. RENAME TABLE
19. TRUNCATE TABLE
20. SET AUTOCOMMIT=1
21. START TRANSACTION
22. CREATE TABLE ... SELECT
23. CREATE TEMPORARY TABLE ... SELECT除外
2、用户管理
1. CREATE USER
2. DROP USER
3. GRANT
4. RENAME USER
5. REVOKE
6. SET PASSWORD.
事务控制
1. BEGIN
2. LOCK TABLES
3. SET autocommit = 1 (if the value is not already 1)
4. START TRANSACTION
5. UNLOCK TABLES.
6. LOCK TABLES & UNLOCK TABLES 也会
7. FLUSH TABLES WITH READ LOCK & UNLOCK TABLE除外
4、数据导入
LOAD DATA INFILE
表管理语句
1. ANALYZE TABLE
2. CACHE INDEX
3. CHECK TABLE
4. LOAD INDEX INTO CACHE
5. OPTIMIZE TABLE
6. REPAIR TABLE
事务隔离级别可以解决哪些并发操作中存在的问题:
• dirty read(脏读)
• unrepeatable read(不可重复读)
• phantom read(幻读)
为了解决 脏读、幻读、不可重复读,我们引入事务隔离级别:
• Read Uncommitted(读未提交)
• Read Commited(读已提交)
• Repeatable Read(可重复读)
• Serializable(串行)
脏读:可以读取未提交的数据。RC 要求解决脏读;
不可重复读:同一个事务中多次执行同一个select, 读取到的数据发生了改变(被其它事务update并且提交);
可重复读:同一个事务中多次执行同一个select, 读取到的数据没有发生改变(一般使用MVCC实现);RR各级级别要求达到可重复读的标准;
幻读:同一个事务中多次执行同一个select, 读取到的数据行发生改变。也就是行数减少或者增加了(被其它事务delete/insert并且提交)。SERIALIZABLE要求解决幻读问题;
这里一定要区分 不可重复读 和 幻读:
不可重复读的重点是修改:
同样的条件的select, 你读取过的数据, 再次读取出来发现值不一样了
幻读的重点在于新增或者删除:
同样的条件的select, 第1次和第2次读出来的记录数不一样
从结果上来看, 两者都是为多次读取的结果不一致。但如果你从实现的角度来看, 它们的区别就比较大:
对于前者, 在RC下只需要锁住满足条件的记录,就可以避免被其它事务修改,也就是 select for update, select in share mode; RR隔离下使用MVCC实现可重复读;
对于后者, 要锁住满足条件的记录及所有这些记录之间的gap,也就是需要 gap lock。
在my.cnf 配置文件中的 [mysqld] 分段中,加入一行
transaction-isolation = “READ-COMMITTED” #默认值是REPEATABLE-READ
• 在线动态修改
SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL READ COMMITTED
• 查看当前隔离级别
SELECT @@GLOBAL.TX_ISOLATION, @@SESSION.TX_ISOLATION, @@TX_ISOLATION;
简单讲讲CAP/base/paxos算法。
分布式领域CAP理论,
Consistency(一致性), 数据一致更新,所有数据变动都是同步的
Availability(可用性), 好的响应性能
Partition tolerance(分区容错性) 可靠性
任何分布式系统只可能满足二点,没法三者兼容
CA:如果不要求P(分区),强一致性和可用性可以保证。
CP:每个请求都需要在server直接强一致性,很多传统的数据库分布式事务。
AP:要高可用并允许分区,则需要放弃一致性。许多nodql类似
BASE:弱一致性协议
基本可用(Basically Available):系统能够基本运行、一直提供服务。
软状态(Soft-state):系统不要求一直保持强一致状态。
最终一致性(Eventual consistency):系统需要在某一时刻后达到一致性要求。
所谓最终一致性,就是不保证在任意时刻任意节点上的同一份数据都是相同的,
但是随着时间的迁移,不同节点上的同一份数据总是在向趋同的方向变化。也可以简单的理
解为在一段时间后,节点间的数据会最终达到一致状态,这就是BASE。
Paxos算法:
两阶段提供了锁和商量的机制,多数派概念支持了冲突中的一致性。