mysql-事务、简单易懂

一、事务简介:

事务 是一组操作的集合,包含了一组数据库操作命令 它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

  • 事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元。
  • 事务适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等。
  • 事务通过事务的整体性以保证数据的一致性。
  • 事务能够提高在向表中更新和插入信息期间的可靠性。

总结:

所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

二、事务操作

方式一、

查看/设置事务提交方式:

SELECT @@autocommit;

SET @@autocommit = 0;

提交事务:

COMMT

回滚事务:

ROLLBACK;

update yt_lis set money = 2000 where name = '张无忌' or name = '杨逍';

select @@autocommit;
-- 设置手动提交
set @@autocommit = 0; 
-- 转账操作(杨逍给张无忌转账1000)
select * from yt_lis where name = '杨逍';
-- 将杨逍的余额-1000
update yt_lis set money = money - 1000 where name = '杨逍';
-- 将张无忌账户余额+1000
update yt_lis set money = money + 1000 where name = '张无忌';
-- 提交事务
commit;
-- 回滚事务
rollback;

设置手动提交,转账操作过程中没有错误直接提交事务,数据库的数据也发生改变。

转账操作过程若失败了,则不会提交事务,会回滚事务,不会影响到数据库数据。

方式二、

开启事务:

START TRANSACTION 或 BEGIN;

提交事务:

COMMIT;

回滚事务:

ROLLBACK;

先开启事务:

start transaction

start transaction
-- 转账操作(杨逍给张无忌转账1000)
select * from yt_lis where name = '杨逍';
-- 将杨逍的余额-1000
update yt_lis set money = money - 1000 where name = '杨逍';
-- 将张无忌账户余额+1000
update yt_lis set money = money + 1000 where name = '张无忌';
-- 提交事务
commit;
-- 回滚事务
rollback;

先设置set @@autocommit = 1;开启事务,转账操作过程中没有错误直接提交事务,数据库的数据也发生改变。

转账操作过程若失败了,不提交事务,提交回滚事务,不会影响到数据库数据。

事务的四大特性:

原子性:事务是一个不可分割的最小操作单元,要么同时成功,要么同时失败。

一致性:事务完成时,必须使所有的数据保持一致状态

隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。

持久性:事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

mysql-事务、简单易懂_第1张图片

并发事务问题:

1.脏读:一个事务读到另一个事务还没提交的数据。

2.不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同。

3.幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在。

事务的隔离级别:

事务隔离级别就是多个事务执行时,互不影响的程度,事务隔离级别不同,出现的事务并发问题就不一样。

事务隔离级别主要分为四类:

1.Read uncommitted(读未提交):

  如果一个事务已经开始写数据,则另外一个事务不允许同时进行写操作,但允许其他事务读此行数据,该隔离级别可以通过“排他写锁”,但是不排斥读线程实现。这样就避免了更新丢失,却可能出现脏读,也就是说事务B读取到了事务A未提交的数据

2.Read committed(读提交):

  如果是一个读事务(线程),则允许其他事务读写,如果是写事务将会禁止其他事务访问该行数据,该隔离级别避免了脏读,但是可能出现不可重复读。事务A事先读取了数据,事务B紧接着更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。

3.Repeatable read(可重复读取):

  可重复读取是指在一个事务内,多次读同一个数据,在这个事务还没结束时,其他事务不能访问该数据(包括了读写),这样就可以在同一个事务内两次读到的数据是一样的,因此称为是可重复读隔离级别,读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务(包括了读写),这样避免了不可重复读和脏读,但是有时可能会出现幻读。(读取数据的事务)可以通过“共享读镜”和“排他写锁”实现。

4.Serializable(可序化):

  提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行,如果仅仅通过“行级锁”是无法实现序列化的,必须通过其他机制保证新插入的数据不会被执行查询操作的事务访问到。序列化是最高的事务隔离级别,同时代价也是最高的,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻读

隔离级别Serializable>Repeatable read>Read committed>Read uncommitted

注意:隔离级别越高,数据越安全,但是性能越低,在开发时应根据实际情况选择合适的隔离级别。

事务隔离级别操作:

1.查看事务隔离级别:

SELECT @@TRANSACTION_ISOLATION;

默认级别为Repeatable read。

2.设置事务隔离级别:

SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL 隔离级别;

SESSION表示当前设置的隔离级别只对当前会话有效,即当前建立的数据库连接。GLOBAL表示全局有效。

你可能感兴趣的:(mysql,数据库)