事务的基本知识

什么是事务?

一般要指要做的或所做的事,通俗点来说,在Java技术中,事务就是由进行一次或多次数据库操作的行为。

为什么要用事务?

比如,订单支付后我们要做两件事:
1.订单状态变为已付款;
2.扣减对应商品的库存(库存扣减);
我们认为这两个行为有关联关系,所以行为一和行为二必须是任意一方失败则都失败,那么,通过什么手段保证这种多个行为的一致性呢?我们需要新技术,所以,事务就有了。比如,数据库事务,事务注解,分布式事务等等名词。
下面我们会一个一个介绍。
先来说事务的一些知识。

事务的四个特性(ACID)

原子性:事务要么全部都被执行,要么就全都不被执行,如果有子事务提交失败,那么其他子事务对数据库的操作将被回滚,数据库回到事务提交前的状态;如果全部子事务都提交成功,则所有的数据库操作都会被提交;
隔离性:事务与事务之间是独立的,不能互相影响。
一致性:事务的执行会将数据库从一种正确状态变更为另一种正确状态(通俗的来说,事务中多次对数据库的操作一定要保证是完整的,而不应该是行为一失败,行为二成功,这样就会产生脏数据);
持久性:事务一旦提交,就会永久保存在数据库中,及时数据库服务器发生故障,也不会丢失提交事务的操作(此处的持久指数据成功的写入到磁盘,只有写入到磁盘的数据才不会因为软件问题丢失);

事务的隔离级别

读未提交:一个事务在执行过程中,既可以访问其他事务未提交的新插入的数据,又可以访问未提交的修改数据。如果一个事务已经开始写数据,则另外一个事务不允许同时进行写操作,但允许其他事务读此行数据。此隔离级别可防止丢失更新。
读已提交:一个事务在执行过程中,既可以访问其他事务成功提交的新插入的数据,又可以访问成功修改的数据。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。此隔离级别可有效防止脏读。
可重复读:一个事务在执行过程中,可以访问其他事务成功提交的新插入的数据,但不可以访问成功修改的数据。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。此隔离级别可有效防止不可重复读和脏读。
可串行化:它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行。此隔离级别可有效防止脏读、不可重复读和幻读。但这个级别可能导致大量的超时现象和锁竞争,在实际应用中很少使用。

所以,隔离级别越高,越能保证数据操作的完整性和一致性,同时并发性能越低,所以一般情况下,读已提交级别即可。

隔离级别对应产生的问题

脏读:脏读发生在一个事务A读取了被另一个事务B修改,但是还未提交的数据。假如B回退,则事务A读取的是无效的数据。这跟不可重复读类似,但是第二个事务不需要执行提交。
不可重复读:同一事务内部的多次数据查询可以不一样(数据被修改)
举个例子:
假设事务按如下顺序执行:
事务一查询id为1的用户数据,返回数据成功;
事务二修改id为1的用户数据,修改成功;
事务一再次查询id为1的用户数据,返回数据成功;
此时,事务一的两次查询在隔离级别不同时返回的数据也可能不同。
序列化和可重复读隔离级别:查询二结果与查询一一致。
提交读和未提交读级别:查询一旧值,查询二新值。
幻读:幻读发生在当两个完全相同的查询执行时,第二次查询所返回的结果集跟第一个查询不相同(数据新增)
比如:
事务A 查询数据表记录数返回100;
事务B 新增数据表数据一条并提交;
事务A 再次查询数据表记录数返回101;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值