Mysql事务
事务的出现是为了解决事务安全。
事务的概念:
同时对两张表进行操作,当操作完第一张表,然后出现了异常导致第二张表的数据出现问题。这样的情况叫做事务安全。
事务特性:
(1)原子性:不可分离性。比如:支付宝转账,要么转账成功,要么转账失败。
(2)一致性:事务前后的数据必须保持一致。比如:支付宝转账,A向B转账,假设转账之前这两个用户的钱加起来总共是1000,那么A向B转账之后,不管这两个账户怎么转,A用户的钱和B用户的钱加起来的总额还是1000,这个就是事务的一致性。
(3)持久性:是指事务一旦被提交,他对数据库里面的数据做出的改变就永久性的,无法改变。
(4)隔离性:当多个用户一起访问数据库时,数据库为每一个用户开启事务,不能被其他事物所操作的数据干扰,所以要互相隔离。
由于有了事务,就有了事务线程安全
一、脏读数据:
比如:
a给b发货,b付钱给a
首先要开启事务
事务的提交(收到d付的钱,a发货)
事务回滚(a出现问题)
二、不可重复读
比如:
酒店,有两个柜台A、B,客户c来到了A柜台,A柜台的人告诉他1120可以入住,可是,客户c的身份证一时没找到,又来了一个客户d,入住1120,这时客户c找到了身份证,但是不能入住1120.
三、幻读(虚读)
数据中有55名同学,读取了一次55名另外一个事务插入增加了一名,56名;又读取一次 发现前后读取数据不一致.
为了解决以上三个问题,出现了事务的隔离,
隔离级别:
一级:
读未提交:哪种问题都不解决(效率最高 最不安全)
二级:
读已提交:解决了脏读
四级:
可重复读:解决了脏读和不可重复读(最常用的mysql默认的级别就是4)
八级:
串读:解决了所有的问题都解决(效率最低)
Mysql事务处理主要有两种办法:
1、用 BEGIN, ROLLBACK, COMMIT来实现
BEGIN 开启事务
ROLLBACK 回滚事务
COMMIT 提交事务
CLOSE关闭事务
2、直接用 SET 来改变 MySQL 的自动提交模式:
SET AUTOCOMMIT=0 禁止自动提交
SET AUTOCOMMIT=1 开启自动提交