-
mysql之TQL(Transaction Control Language)
事务的概念
事务是由单独单元的一个或多个sql语句组成,在这个单元中每个mysql语句相互依赖。整个单元作为一个不可分割的整体,如果单元中某条sql语句一旦执行失败或产生错误,整个单元就会回滚,单元中的所有sql语句执行成功,则事务被执行完成。
存储引擎
mysql中存在不同的存储引擎,使用不同的技术将数据放入数据库中。可以通过show engines查看mysql支持的存储引擎。其中典型的存储引擎有2个innodb是支持事务的,myisam不支持事务。
事务的特性
ACDI
-
原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
-
一致性(Consistency):事务必须从一个一致性的状态变换到另一个一致性状态。
例子:a给b100元钱,那么a就要-100,b就要+100,这两件事情必须同时发生,就叫做事务的一致性。 -
隔离性(Isolation):事务的隔离性是指一个事务执行不能被其他事务干扰。
-
持久性(Durability):持久性是指一个事务一旦被提交对数据库的改变是永久的。
- 1
- 2
- 3
- 4
- 5
- 6
事务的隔离级别
- 脏读(dirty read) 事务A访问了数据库,它干了一件事情,往数据库里加上了新来的牛人的名字“tom”,但是没有提交事务。来了另一个事务B,他要查询所有牛人的名字,这时,如果没有事务之间没有有效隔离,那么事务B返回的结果中就会出现“tom”的名字。
- 不可重复读(unrepeatable read) 事务A访问了数据库,他要查看ID是1的牛人的名字,这时,事务B来了,因为ID是1的牛人改名字了,所以要更新一下,然后提交了事务。接着,事务A还想再看看ID是1的牛人的名字,结果,两次读出来的ID是1的牛人名字竟然不相同,这就是不可重复读。
- 幻读(phantom problem) 事务A访问了数据库,他想要看看数据库的牛人都有哪些,事务B来了,往数据库加入了一个新的牛人。这时候,事务A忘了刚才的牛人都有哪些了,于是又执行了。结果,第一次有三个牛人,第二次有四个牛人。这种情况就叫幻读。
数据库一般有4种隔离级别:
-
Read uncommitted:允许两个事务并行,假如写事务执行了其中一个更改表的操作,并且未提交,那么另一个读事务在查询过程中就会显示更改过后的表。这就叫脏读,Read uncommitted会出现脏读。
-
Read committed:允许两个事务并行,假如写事务执行了其中一个更改表的操作,当且仅当提交的时候,那么另一个读事务在查询过程中才会显示更改过后的表。叫不可重复读,Read committed出现不可重复度。
-
Repeatable read:允许两个事务并行,写事务执行更改表操作并且提交并不会影响正在执行的读事务中的查询。在写事务提交后的新读事务会显示更改过后的表,Repeatable read会出现幻读。
-
Serializable:不允许两个事务并行,只能是一个事务一个事务执行,不能多个事务同时执行,后面来的事务会阻塞,等待前面的事务提交。
orcle只有Read committed和Serializable两种。 mysql有以上4种隔离级别。