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默认的隔离级别是可重复读,一般情况下不要修改