MySQL中的事物管理

1. 事物是什么

事物就是一组DML(数据操纵语言),这些语句在逻辑上存在相关性这一组DML语句要么全部成功,要么全部失败,是
一个整体。
MySQL提供一种机制,保证我们达到这样的效果。

事务还规定不同的客户端看到的数据是不相同的。

例如: 

火车站的售票系统,我们和售票系统 相互组成一个事物,
买票的时候,有一方买了票看,那么另一方看到的票数就不一样了;但是
也有可能数据库没有更新,这边显示票数没有变化,事物就(是保证一边买票
另一边看到票数减一)这个操作的原子性;


总的来说:事物就是保证一组sql语句的原子性

操作事物的一组语句:

创建一个测试表:

create  table  account (
id int  primary key ,

name varchar(100) not null default ' ',

balance decimal(10,2) not null default 0.0
);



插入数据:

insert  into account values(5,'张Y一',10033.00),
(2,'张二',10200.00),
(3,'张3',10300.00),
(4,'张素',13000.00);




1.开启事物:

start transaction;



2.创建一个保存点

savepoint 名字;


3.回到保存点(根据具体情况)


rollback  to 名字;


测试:


select *from account;

+----+---------+----------+
| id | name    | balance  |
+----+---------+----------+
|  1 | 张安    |  1000.00 |
|  2 | 张二    | 10200.00 |
|  3 | 张3     | 10300.00 |
|  4 | 张素    | 13000.00 |
|  5 | 张Y一   | 10033.00 |
|  6 | wewe    |  2222.00 |
+----+---------+----------+


start  transaction;--开启事物 



insert  into account values(7,"www",5555.00);


savepoint aa;--保存节点

select *from account;--查看一下

----+---------+----------+
| id | name    | balance  |
+----+---------+----------+
|  1 | 张安    |  1000.00 |
|  2 | 张二    | 10200.00 |
|  3 | 张3     | 10300.00 |
|  4 | 张素    | 13000.00 |
|  5 | 张Y一   | 10033.00 |
|  6 | wewe    |  2222.00 |
|  7 | www     |  5555.00 |
+----+---------+----------+
--在插入一条数据
insert  into account values(8,"baidu",5665.00);

savepoint bb; --保存节点

select *from account;

+----+---------+----------+
| id | name    | balance  |
+----+---------+----------+
|  1 | 张安    |  1000.00 |
|  2 | 张二    | 10200.00 |
|  3 | 张3     | 10300.00 |
|  4 | 张素    | 13000.00 |
|  5 | 张Y一   | 10033.00 |
|  6 | wewe    |  2222.00 |
|  8 | baidu   |  5665.00 |
+----+---------+----------+

--现在发现这条数据插错了,向返回上一次操作

--那么回滚 rollback

rollback to aa;--返回上次执行的位置

select *from account;




事务操作注意事项

1.如果没有保存点(savepoint),也可以使用回滚回滚到事物开始的时候,直接使用回滚rollback(前提是事物没有提交)

2.被提交了如果事物(commit),则不可以使用回滚。

3.可以选择回滚到那个保存点

4.InnoDB 支持事物,MyISAM不支持事物

5.开始事物 start transaction;

2.事物的ACID特性

1.原子性(Atomicity)

事物不可在分割的逻辑执行体,最小的执行单位。

2.一致性(Consistency)

事物的执行结果必须,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库只包含事物提交时,数据库处于一个一致性状态。如果系统发生中断时,某个事物没有完成被迫中断,而为完成的事物对数据库所做的修改已经写入数据库中,此时处于一种不一致的状态,因此一致性是通过原子性保证的。

3.隔离性(Isoliation)

各个事物的执行互不干扰,任意一个事物的内部操作对于其他并发事物都是隔离的。也就是说并发的事物不能看见对方的中间状态,并发的事物之间不能相互影响。

4.持久性(Durability)

一旦事物被提交(commit),它对数据库所做的操作就会永久被保存在存储中。(如:磁盘)

3. 事务的隔离级别

隔离级别:当MySQL表被多个线程或者客户端开启各自事务操作数据库中的数据时,MySQL提供了一种机制,可以让不同的
事务在操作数据时,具有隔离性。从而保证数据的一致性

例如:一个人查看表的时候就不能有人写入等隔离对表的操作

没有隔离级会发生的问题

1.脏读

当一个事物正在访问数据的时候并且对数据做了修改,但是这个数据并未提交到数据库中,但是另一个事物访问了这个数据,并且使用了这个数据。

注:没有提交的数据,可以使用回滚然后数据恢复到原来的样子,那么原来的那条数据不可靠,它就是一个脏读数据

注:发生在事物没有提交的时候

2.不可重复读

指一个事物多次读取表中同一数据,还没有读完,另一个事物就对这个数据做了修改,这就导致了,第一事物两次读取的数据不相同,这就是不可重复读

注:事物未提交和事物提交了都有可能发生

3.幻读

指事物不是独立执行时发生的一种现象。

例如:
一个事物正在修改表中的所有数据,与此同时另一个事物给表中插入了一条数据。
当下次前一个事物在操作表的时候发现多了一条数据。好像出现幻觉一样怎么多
出来了一条数据。这就是幻读。



注:不可重复读重点是修改。同样的条件,前后两次读取的数据不一样

幻读关注的是关于新增和删除。同样条件下,第一次和第二次读取出来的记录数不一样

事务的隔离级别

1.读未提交(read uncommitted):

会发生的问题:

  • 脏读
  • 幻读
  • 不可重复读

注:不加读锁

2.读已提交(read committed):

会发生的问题:

  • 幻读
  • 不可重复读

注:不加读锁

3.可重复读(repeatable read):

不会发生幻读、不可复读、脏读。

注:不加读锁。

4.可串行化(serializable):

不会发生幻读、不可复读、脏读。

注:加读锁

串行化举例:

当客户端A在执行select过程中,DBMS会对库加锁,如果这时客户端B执行插入,只要
还没释放锁,插入不进去,会将B的update语句放入等待队列,直到释放了锁或超时。
设置隔离级别的语句:


设置为:读未提交的级别

set session transaction isolation level read uncommitted;


结果:
Query OK, 0 rows affected (0.03 sec)



查看隔离级别:

select @@tx_isolation;

结果:
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+

说明:mysql默认的隔离级别是可重复读,一般情况下不要修改

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值