Spring中事物的隔离级别

事物的隔离级别并不是Spring专属的,而是数据库中存在的概念。

隔离级别是指:

在数据库系统中,多个事务可能同时运行,而这些事务之间可能会相互干扰,导致数据不一致或丢失。隔离级别就是用来控制这种干扰的程度,确保事务的并发执行既高效又安全。
 隔离级别是多个事务同时访问同一数据时的隔离程度

隔离级别一共有4种:

  • 读未提交:READ UNCOMMITTED

    允许Transaction01读取Transaction02未提交的修改。

    • 一个事务可以读取到另一个事务尚未提交的数据。

    • 这种隔离级别可能导致脏读(Dirty Read)问题,即一个事务读取到了另一个事务未提交的数据,而这些数据有可能在后续被回滚。

  • 读已提交:READ COMMITTED、

    要求Transaction01只能读取Transaction02已提交的修改。

    • 较为常用的隔离级别。

    • 一个事务只能读取到另一个事务已经提交的数据。

    • 这种隔离级别可以避免脏读问题,但仍可能发生不可重复读(Non-repeatable Read)问题,即一个事务在多次读取同一数据时,发现数据被其他事务修改并提交。

    案例:两个事务同时操作一个银行账户。

    事务A操作,查询到账户余额1000元,这个时候事务A停止操作,比如等待用户输入密码。这个时候事务B对该账户进行修改,余额改成了2000元,当事物A再来执行的时候发现数据发生变化了。两次读取的数据不一致。

  • 可重复读:REPEATABLE READ

    确保Transaction01可以多次从一个字段中读取到相同的值,即Transaction01执行期间禁止其它事务对这个字段进行更新。

    • 一种较高的隔离级别。

    • 一个事务可以多次读取同一数据并获得相同的结果,即使其他事务已经修改并提交了数据。

    • 这种隔离级别可以避免脏读和不可重复读问题,但仍可能发生幻读(Phantom Read)问题,即一个事务在多次读取同一范围的数据时,发现其他事务插入了新的数据。

    • 性能较低,但并发安全性较好,适用于需要确保数据一致性的场景。

    案例场景,

  • 串行化:SERIALIZABLE

    确保Transaction01可以多次从一个表中读取到相同的行,在Transaction01执行期间,禁止其它事务对这个表进行添加、更新、删除操作。可以避免任何并发问题,但性能十分低下。

总结一下:就是多个事物对同一个数据进行操作。

读未提交就是第一个事物还没提交但是修改了,第二个事物就将这个修改值读取了。发生脏读。(事物要全部执行完毕才提交,但是修改是在运行到修改指令那一行就开始了。)

读已提交就是第一个事物提交之后,第二个事物才能读取。这样可以避免脏读,但是会存在不可重复读问题,当重复读一个数据,发现这个数据可能被其他事物修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值