您的位置:首页 > 数据库 > MySQL

浅谈mysql事务

2016-03-30 00:00 330 查看
摘要: mysql 事务

浅谈mysql事务
数据库是一切工作的基础,没有数据其他工作也将失去意义-----不知道哪位大牛说的,也可能是我瞎掰的(嗨嗨)

一.理解ACID(原子性、一致性、隔离性、持久性)并不是专属于mysql数据库

来一个例子吧:

银行数据库中有两张表:信用卡表(checking),储蓄表(savings)。现在要从用户A的信用卡账户转移1000块到他的储蓄账户之中,那么最起码需要以下步骤:

1.检查信用卡账户的余额大于1000块
2.将信用卡账户的余额减去1000块

3.将储蓄账号的余额加上1000块

上面三个步骤必须打包在一个事务之中,要失败就全部回滚三个步骤

事务sql的样本:
(1)start transaction;

(2)select balance from checking where customer_id='1110000'

(3)update checking set balance=balance-1000 where customer_id='1110000'
(4)update savings set balance=balance+1000 where customer_id='1110000'

(5)commit;
我们想一个问题:

如果上述语句执行到第四句的时候服务器崩溃了,会出现什么情况?

是用户损失了1000块,还是银行损失了1000块,还是什么其他的状况?天知道

现在再去理解的ACID的概念是不是很简单了,当然,ACID在现实中要完全实现非常困难,甚至不可能。真正的实现也没有这里说的如此简单,这里只能阐述一下概念。
1.原子性保证一个事务为一个最小的单元,内部不可分割;(可以理解为最小执行单元)。整个事务中的所有操作要么全部提交成功,要么全部失败回滚,不可能执行其中的一部分。
  2.数据库总是从一个一致性的状态转换到另一个一致性的状态。在这个例子中,一致性可以确保即使数据库崩溃了(没有commit之前),信用卡账户也不会损失1000块。因为还没有提交,事务所做的修改也不会保存到数据库中去。
   3.隔离性保证不同事务间看到的数据视图相互独立,相互隔离(隔离级别可设置),以后会讨论一下关于隔离级别(Isolation level)的问题;
4.持久性保证事务提交后数据会持久的保存下来;
二.使用事务
MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关1.MyISAM:不支持事务,用于只读程序提高性能 2.InnoDB:支持ACID事务、行级锁、并发 3.Berkeley DB:支持事务(我抄的,嗨嗨!!)
(1)提交事务(关闭事务)
COMMIT:提交
(2) 放弃事务(关闭事务)
ROLLBACK:回滚
注:设立回滚点savepoint
SAVEPOINT point1
ROLLBACK TO SAVEPOINT point1
发生在回滚点 point1之前的事务被提交,之后的被忽略
(3)MYSQL的事务处理的两种方法
1.用begin,rollback,commit来实现
begin开始一个事务
rollback事务回滚
commit 事务确认(如果失去数据库连接则没有commit的事务都会失去)
2.直接用set来改变mysql的自动提交模式
mysql默认是自动提交的,也就是你提交一个query,就直接执行!可以通过
set autocommit = 0 禁止自动提交
set autocommit = 1 开启自动提交
注:当用set autocommit = 0 的时候,你以后所有的sql都将作为事务处理,直到你用commit确认或 rollback结束,注意当你结束这个事务的同时也开启了新的事务!按第一种方法只将当前的做为一个事务!

三.事务的锁定(此段摘自http://www.cnblogs.com/ymy124/p/3718439.html,感谢:网名还没想好)
mysql系统默认: 不需要等待某事务结束,可以直接查询结果,但是无法进行修改、删除。
缺点:可能查询的是过期的结果。
优点:可直接查询结果,不需要等待事务结束。
分类:
1、SELECT …… LOCK IN SHARE MODE(共享锁)
查询到的数据,就是数据库在这一时刻的数据(其他已commit事务的结果,已经反应到这里了)
SELECT 必须等待,某个事务结束后才能执行
2、SELECT …… FOR UPDATE(排它锁)
例如 SELECT * FROM tablename WHERE id<200
那么id<200的数据,被查询到的数据,都将不能再进行修改、删除、SELECT …… LOCK IN SHARE MODE操作
一直到此事务结束
共享锁 和 排它锁 的区别:在于是否阻断其他客户发出的 SELECT …… LOCK IN SHARE MODE命令
3、INSERT / UPDATE / DELETE
所有关联数据都会被锁定,加上排它锁
4、防插入锁
例如 SELECT * FROM tablename WHERE id>200
那么id>200的记录无法被插入
5、死锁
自动识别死锁
先进来的进程被执行,后来的进程收到出错消息,并按ROLLBACK方式回滚
innodb_lock_wait_timeout = n 来设置最长等待时间,默认是50秒
四.事务的隔离(转自:http://xm-king.iteye.com/blog/770721)
SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
1.Read Uncommitted(读取未提交数据): 在这个隔离级别,所有事务都可以看到其他未提交事务的执行结果,脏读(Dirty Read)实际用的并不多。
2.Read committed(读取提交):这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
3.Repeatable Read(可重复读取):这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
4.Serializable(可序列化):这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql 事务 ACID