mysql -- 事务

一、介绍

1、事务是多个数据操作(CURD)的组合;

2、举例:

例如,游戏中 A 账户向 B 账户转账

1.  A 更新,减掉金额

2.  B 更新,加金额失败(断电),转账事务要整体失败,回退到以前的状态

3、事务特性

转自https://blog.csdn.net/lulei1217/article/details/50954226

1)原子性:

事务中包含的程序作为数据库的逻辑工作单位,它对数据库中的数据进行操作时,要么全部执行,要么都不执行。

2)一致性:

  转账前 a+b = 100

 转帐后 a+b = 100

3)隔离性:

即一个事务的内部操作及正在操作的数据必须被封锁起来,不会被其他的事务来企图修改。这一点和Java中多线程编程的同步锁很像。

举个例子:假如你给小A打钱过去,同时小B也在给小A打钱。这时候数据库服务器中要么会让你的事务先执行,或者让小B的事务先执行。不存在你两个的打钱动作会同时来修改小A卡里的金额

4)持久性:

持久性是指当数据库系统出现故障了,要确保已经提交的事务的更新是不会丢失的。即数据库中的数据的修改是永久性的。就算系统出现了故障,我们也可以使用数据库的备份和恢复来保证数据的修改。

4、事务操作

begin:

start transaction;

commit;

rollback:这时用一条 ROLLBACK 语句回退START TRANSACTION 之后的所有语句

5、事务隔离级别

1)事务完全隔离,一个事务完成,另一个事务才能执行,效率低;

事务不隔离,会有数据访问冲突,数据不安全;

数据库当中,可以设置事务的隔离性,来兼顾安全和性能;

2)数据访问冲突

脏读:当事务读取还未被提交的数据时

举例来说:Transaction 1 修改了一行数据,然后 Transaction 2 在 Transaction 1 还未提交修改操作之前读取了被修改的行。

如果 Transaction 1 回滚了修改操作,那么 Transaction 2 读取的数据就可以看作是从未存在过的。

虚读(不可重复读):当事务两次读取同一行数据,但每次得到的数据都不一样时,就会发生这种事件

不可重复读主要原因是: 修改或删除

Transaction 1 读取一行数据,然后 Transaction 2 修改或删除该行并提交修改操作。

当 Transaction 1 (同一个事务)试图重新读取该行时,它就会得到不同的数据值(如果该行被更新)或发现该行不再存在(如果该行被删除)

幻读:如果符合搜索条件的一行数据在后面的读取操作中出现,但该行数据却不属于最初的数据,就会发生这种事件。

幻读主要点是:新增

Transaction 1 读取满足某种搜索条件的一些行,然后 Transaction 2 插入了符合 Transaction 1 的搜索条件的一个新行。

如果 Transaction 1 重新执行产生原来那些行的查询,就会得到不同的行

6、事务隔离级别

读未提交 Read Uncommitted

 允许脏读取一个事务修改,允许另一个事务读取

但不允许更新丢失一个事务修改,不允许另一个事务修改

读提交 Read Committed:

允许 不可重复读取事务1读取数据未提交时,允许其他事务修改数据,但不允许脏读取一个事务修改,不允许另一个事务读取

可重复读取 Repeatable Read

禁止 不可重复读取和脏读取,允许幻读(事务1读取时,允许事务2插入或删除数据)

事务序列化 Serializable

它要求事务 序列化执行,事务只能一个接着一个地执行,但不能并发执行

 

猜你喜欢

转载自blog.csdn.net/qq_24271537/article/details/81318799