mysql-事务(很重要)

事务是什么

一个完整的业务逻辑。具有原子性。只能对数据操作的过程起作用。
例如:银行转账,张三给李四转了100万,那么张三的账号减少100万的同时李四的账号应该增加100万。

事务起作用的语句。

insert ,delete,update.(增删改表中的数据),全部是DML

事务的英语

transaction.

事务默认的方式

前面说了事务起作用的语句是:insert,delete,update.
只要执行了一次上面的语句,那么事务就结束了一次。
默认的方式是提交,即commit,这个不需要我们去操作。

--这里写个例子
insert into t_user values('zhangsan','male',23);--然后回车
--是不是就完成了,哪里看到了transaction.
--这里说明事务默认的是提交commit

如何开启手动提交


 - List item

start transaction; --开启事务,这一句就是开启手动提交。

开启手动提交的事务的例子

start transaction; --手动开启事务
insert into t_user values('zhangsan','male',45); --插入t_user这张表一行数据
delete from t_user where name = 'zhangsan';
--删除t_user 这张表里姓名等于zhangsan
commmit;--提交事务
--到此事务就结束了

事务可以提交以及回滚

  • 提交和回滚都是结束事务的方式
  • 提交是commit,那么事务就是执行成功了
  • 回滚是rollback,回滚那么开启手动后的事务都没有操作成功

事务的四个特性

  1. 原子性:事务是一个整体,不能再分割。
  2. 持久性:一旦提交,就不能再进行修改了。
  3. 隔离性:事务之间不相互影响。
  4. 一致性:在同一个事务中,所有的操作必须一致,要么同时提交,要么同时回滚。

隔离性

事务之间的隔离性有四个级别,下面的级别随着数字增大,级别越大。
在这里插入图片描述

  1. 读未提交:read uncommitted(现实中根本不会遇到,没有提交就读取到了)。事务M读到了事务N未提交的数据。只存在理论中,造成的问题就是脏读现象。就是读到了脏数据。
  2. 读已提交:read committed(现实中遇到的隔离级别最低级别,提交才能读取到的)。事务M只能读到了事务N提交后的数据。解决了脏读的问题。造成了不可以重复读取数据。就是事务M现在读取到了事务N提交的事务有100条数据,但是一个小时后事务N添加了10000条数据,修改了20条数据,删除了500条数据,事务M一个小时后就读到了99520条数据。是不是读取的数据不一样呀,就是不可重复读。每一次读取的数据是真实有效的。(oracle中默认的隔离级别)
  3. 可重复读:repeatable read(提交之后也读不到)。事务M开启后,任何时间在事务M中读取的数据都是一样的,即使事务N修改了数据中的信息,在事务M中仍然是一样的。解决了不可重复读的问题。带来了新的问题:幻影读。即读到的数据不真实。明明事务N修改了数据,但是事务M中仍然独到的是原数据。读取到的数据就是不真实的。(mysql中默认的隔离级别)
  4. 序列化或者叫串行化:serializable(最高隔离级别)。效率低下,但是安全。有点类似于加锁。

spring中7种事务传播机制

spring的事务传播机制,有哪7种?

  1. required spring 的默认事务传播机制,如果没有事务,则会开启新的事务;如果当前有事务,则会加入当前事务中
  2. supports 如果当前有事务,则使用事务;如果没有,则不使用

属性 说明
REQUIRED spring默认的事务传播行为,如果当前没有事务,则会开启一个事务,如果当前有一个事务,则加入当前的事务中。
SUPPORTS 如果当前有事务,则使用事务,如果没有,则不使用。
MANDATORY 表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常。不会主动开启一个事务。
REQUIRES_NEW 表示当前方法必须运行在它自己的事务中。一个新的事务将被启动,如果存在当前事务,在该方法执行期间,当前事务会被挂起(如果一个事务已经存在,则先将这个存在的事务挂起)
NOT_SUPPORTED 表示该方法不应该运行在事务中,如果存在当前事务,在该方法运行期间,当前事务将被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager。
NEVER 表示当前方法不应该运行在事务上下文中,如果当前正有一个事务在运行,则会抛出异常。
NESTED 表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在,那么其行为与REQUIRED一样。嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值