12 事务

Posted deepsealin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了12 事务相关的知识,希望对你有一定的参考价值。

1.事务的概念

指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功

mysql 默认自带事务,但是 mysql 自带的事务是一条语句独占一个事务

我们也可以自己来控制事务:

start transaction;  --开启事务,这条语句之后的sql将处于同一事务中,并不会立即影响到数据库

...

...

commit;   -- 提交事务,让这个事务中的sql对数据库的影响立即发生。

rollback;  -- 回滚事务,取消这个事务,这个事务不会对数据库的数据产生影响了。

 

2.事务的四大特性  ACID

○ 原子性   事务是一组不可分割的单位,要么同时成功,要么不成功

○ 一致性   事务前后的数据完整性应该保持一致。(如果数据库在某个时间点下,所有的数据都符合所有的约束,则称数据库为符合完整性的状态)

○ 隔离性   多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务干扰,多个并发事务之间数据要相互隔离

○ 持久性  持久性是指一个事务一旦被提交,它对数据库数据的改变是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

 

隔离性:本质是多个线程操作同一个资源造成的多线程并发安全问题。

● 加锁可以保证隔离性,但会造成数据库的性能问题。

● 如果两个事务并发的修改:必须隔离开!

● 如果两个事务并发的查询:不用隔离

● 如果一个事务修改,另一个事务查询:

   脏读:一个事务读取到另一个事务未提交的

   不可重复读: 一个事务多次读取一条记录,读取的结果不同(一个事务读取到另一个事务已经提交的数据)

    虚读个事务多次查询整表的数据,由于其他事务新增(删除)记录造成多次查询出的记录条数不同

 

四大隔离级别  -- 四个选项数据库的使用者可以控制数据库工作在哪个级别下,可防止不同的隔离性问题。

read uncommitted  --  不作任何隔离,具有上述三种问题

read committed  --  可以防止脏读

repeatable read  -- 可以防止脏读、不可重复读  (mysql  默认是这个级别

serializable   --  数据库运行在串行化模式下, 所有问题都没有,但性能很低

修改隔离级别  --  set session/global transaction isolation level  隔离级别;  

查询当前数据库的隔离级别  --  select @@tx_isolation;

以上是关于12 事务的主要内容,如果未能解决你的问题,请参考以下文章

聊聊spring事务失效的12种场景,太坑了

linux12 -MYSQL数据库 -->11事务和锁机制

day12-事务

SpringCloud(12)— 分布式事务(Seata)

12事务

Spring 事务传播行为(12)