😦😃😦😃😦😃


文章目录

  • 事务
  • 事务是什么?
  • 事务的ACID特性
  • 隔离级别
  • 事务的并发所带来的问题



事务

事务是什么?

初次听到事务是在讲存储引擎的时候提到过; 在建表时,如果不指定存储引擎,默认时InnoDB。ENGINE=存储引擎名;InnoDB支持事务,支持外键约束(保证数据的完整性和正确性) ; MyISAM不支持事务,不支持外键

事务是一个不可再分割的工作单元(原子性),将一组SQL语句放在同一批次内去执行,要么全部成功,如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行,全部失败;

在关系型数据库中,一个事务可以是一条SQL语句、一组SQL语句或者整个程序。

事务和程序是两个概念。一般地讲,一个程序中包含多个事务。

-- 关闭MYSQL自动提交
set autocommit = 0;
-- 开启一个事务,标记事务的起始点
start transaction;
-- 一组SQL语句
-- 向数据库提交事务
commit;
-- 将事务回滚,所有的数据库操作被取消
rollback;
-- 开启MYSQL自动提交
set autocommit = 1;

事务的ACID特性

事务具有4个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、和持久性(Permanence)。这4个特性简称为ACID特性(ACIDproperties)。

原子性:事务是数据库的逻辑工作单位,事务中所有操作要么全部执行成功,要么全部失败。

隔离性:事务在执行过程中,是与外界完全隔离的,即使数据库发生了变更,事务中也获取不到。A 事务对数据库做的变更,在事务未提交之间,数据库中也看不到,B 事务中也看不到。

持久性:也称永久性指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其执行结果有任何影响。

一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。

只有当前三条特性都满足了,才能保证事务的一致性

当我们使用Mybatis将Java和数据库连接后,利用.java文件编写对数据库进行insert、delete、update操作的sql语句时,Mybatis默认不自动提交事务,数据库中的数据不会改变。

所以我们要手动提交事务:

sqlSession.commit();
sqlSession.rollback();

如果想让程序自动提交事务:

就是在openSession方法中加上参数"true"

mysql 结束事务 mysql事务关闭_mybatis

隔离级别

SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。

mysql 结束事务 mysql事务关闭_mybatis_02

读未提交( Read Uncommitted )

读未提交是隔离级别最低的一种事务级别。在这种隔离级别下,会出现脏读。

读提交/不可重复读(Read Committed)

在此隔离级别下,事务只能看见已经被提交的数据,当读取一个事务两次,读取到的结果不相同,说明这个事务在两次读取期间被进行修改了。不可重复读

可重复读(Repeatable Read)

这是MySQL默认的隔离级别;它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。这就在理论上会产生幻读

可串行化(Serializable)

最严格的隔离级别。在Serializable隔离级别下,所有事务按照次序依次执行,因此,脏读、不可重复读、幻读都不会出现。

它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。效率会大大下降,应用程序的性能会急剧降低。如果没有特别重要的情景,一般都不会使用Serializable隔离级别。

默认隔离级别:如果没有指定隔离级别,数据库就会使用默认的隔离级别。在MySQL中,如果使用 InnoDB,默认的隔离级别是Repeatable Read。

事务的并发所带来的问题

当多个事务并发执行的时候,就会出现脏写、脏读、不可重复读和幻读

脏写:当前事务(A)可以修改其他事务(B)未提交的数据(数据没提交有可能回滚),而导致有可能数据前后不一致的问题。

肮读:当前事务(A)可以查询到其他事务(B)更新后但未提交的数据,而导致有可能数据前后不一致的问题。

不可重复读:在事务A中先后两次读取同一个数据,两次读取到的结果不一样。

脏读和不可重复读的区别就在于:脏读读到的是其他事务未提交的数据,后者读到的是其他事务已提交的数据

幻读:在事务(A)中按照某个条件先后两次查询数据库,两次查询结果的条数不同,(出现了和第一次没见到的数据)就是幻读。

不可重复读和幻读的区别就在于:不可重复读是数据变了,幻读是数据的行数变了

😃😃😃😃😃