service和controller都加了事务_MySQL_3_事务和锁

本文深入探讨了MySQL中的事务与锁,包括事务的ACID特性、隔离级别(如读未提交、读已提交、可重复读和串行化),重点讲解了可重复读的实现原理——MVCC(多版本并发控制)以及如何通过锁(如共享锁、排他锁、意向锁和间隙锁)来防止幻读。同时,介绍了InnoDB存储引擎中的行锁机制,分析了无索引行锁升级为表锁的情况,以及行锁与MVCC如何协同工作,以提高并发性能和解决幻读问题。
摘要由CSDN通过智能技术生成

事务与锁

1. 事务

1.1 什么是事务

要么都成功,要么都失败

(1)事务原则(ACID)

原子性(Atomicity):要么都成功,要么都失败。

一致性(Consistency):事务前后的数据完整性要保证一致。

隔离性(Isolation):多个用户并发访问数据库时,数据库为每个用户开启的事务不能被其他事务的操作所干扰。

持久性(Durability):事务一旦提交则不可逆,被持久化到数据库中。

事务的隔离性是通过锁实现,而事务的原子性、一致性和持久性是通过事务的日志实现的

(2)事务的隔离级别(隔离性产生的问题)

赃读:指一个事务读取了另外一个事务未提交的数据。

不可重复读:在一个事务内读取表中某一行数据,多次读取结果不同。(不一定是错误,只是某些场合不对,主要指其他事务的更新语句和删除语句的影响)

幻读:指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。(主要指其他事务的插入语句的影响)

(3)执行事务的原理

-- 1.mysql是默认开启事务自动提交的
set autocommit = 0 --关闭
set autocommit = 1 --开启(默认的)

-- 2.1手动开启事务
set autocommit = 0
-- 2.2事务开启
start transaction  --标记一个事物的开始,从这个之后的sql都在同一个事务内
insert...... --模拟一个事务
insert...... --模拟一个事务
-- 2.3提交:持久化(成功!)
commit
-- 2.4回滚:回到原来的样子(失败的话)
rollback
-- 2.5事务结束
set autocommit = 1

事务的执行过程如下,以 begin 或者 start transaction 开始,然后执行一系列操作,最后要执行 commit 操作,事务才算结束。当然,如果进行回滚操作(rollback),事务也会结束。需要注意的是,begin 命令并不代表事务的开始,事务开始于begin 命令之后的第一条语句执行的时候。

c077d9f78ff55563030b8a165336383a.png
事务执行流程

(4)事务的四种隔离级别

  • 读未提交、读已提交、可重复读、串行化
33ffab5f2163ff76c890df43f444d1e7.png
隔离级别

说明:

1)一般不考虑读未提交串行化。因为读未提交什么问题都没有解决,而序列化虽然解决了所有的问题,但是序列化杜绝了并发问题,改为串行执行了,没有太大的意义,性能反而越来越低了。

2)主要使用的是可重复读,它是InnoDB引擎默认使用的隔离级别;不可重复读是Oracle默认使用的隔离级别。

扩展:思考题

aafe70e49be6c507051902a7d6292e96.png
不同隔离级别下的运行效果

参考答案:

  • 读未提交:V1=20;V2=20;V3=20

  • 读已提交:V1=18;V2=20;V3=20

  • 可重复读:V1=18;V2=18;V3=20

  • 序列化:V1=18;V2=18;V3=20

1.2 事务高级语法

-- 1.查看事务是否已经开启(默认开启的ON)
show variables like 'autocommit'

-- 2.autocommit等同于以下一系列操作
begin;
update ...;
delete...;
insert...;
commit;
rollback;
1.2.1 事务隔离级别的实现方式

主要指的是可重复读的实现方式。主要靠锁来实现的

总结:读已提交解决了脏读问题,行锁解决了并发更新的问题。并且 MySQL 在可重复读级别解决了幻读问题,通过行锁和间隙锁的组合 Next-Key 锁实现的

-- 1.查看当前数据库使用的是哪种隔离级别?
show variables like 'transaction_isolation';

1)LBCC(Lock-Based Concurrent Control,基于锁的并发控制)、MVCC(Multi-Version Concurrent Control,多版本并发控制,行级锁的变种)。

2)表锁行锁

0bab606ea5a7acc9f5dc982c948b05a4.png
行锁与表锁

表锁(类似于订整个酒店),行锁(类似于订酒店里的一个房间)。行锁与表锁是基于索引来说的(且索引要生效),不带索引 (表锁)要全表扫描

3)InnoDB锁

角度一:锁的模式
8e75eaa991aa98ac2a71566b0e611f26.png
锁的模式
3.1 共享锁(行锁)——Shared Locks

又名读锁(简称S锁),对某一资源加共享锁,自身可以读该资源,其他人也可以读该资源(也可以再继续加共享锁,即共享锁可以多个加在同一个记录上),但无法修改。要想修改就必须等待所有共享锁都释放完之后才能进行。

-- 1.加锁
select * from table_nale lock in share mode; -- lock in share mode

-- 2.释放锁
commit;
rollback;

情况一:有且仅有我自己访问,我加了行锁后,我仍然可以更改数据;

情况二:还有别人的读锁时,我就不能再修改了。

应用场景:财务统计。

3.2 排它锁(行锁)——Exclusive Locks

又名写锁(简称X锁),多某一资源加排他锁,自身

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是MySQL数据库事务管理代码示例结合springcloudAlibaba和mybatis: 1. 在SpringCloud Alibaba微服务中配置数据源和事务管理器: ```java @Configuration public class DataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSource() { return new DruidDataSource(); } @Bean public DataSourceTransactionManager transactionManager() { return new DataSourceTransactionManager(dataSource()); } } ``` 2. 在MyBatis Mapper接口中使用@Mapper注解并定义需要进行事务管理的方法: ```java @Mapper public interface UserMapper { @Transactional void insertUser(User user); @Transactional void updateUser(User user); @Transactional void deleteUser(Long id); } ``` 3. 在服务实现类中调用Mapper接口方法: ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public void addUser(User user) { userMapper.insertUser(user); } @Override public void updateUser(User user) { userMapper.updateUser(user); } @Override public void deleteUser(Long id) { userMapper.deleteUser(id); } } ``` 4. 在Controller层中调用服务实现类方法: ```java @RestController public class UserController { @Autowired private UserService userService; @PostMapping("/users") public void addUser(@RequestBody User user) { userService.addUser(user); } @PutMapping("/users") public void updateUser(@RequestBody User user) { userService.updateUser(user); } @DeleteMapping("/users/{id}") public void deleteUser(@PathVariable Long id) { userService.deleteUser(id); } } ``` 以上就是MySQL数据库事务管理代码示例结合springcloudAlibaba和mybatis的实现步骤。在这个示例中,我们使用了SpringCloud Alibaba微服务框架、MyBatis ORM框架和MySQL数据库。通过使用@Transactional注解,我们可以将需要进行事务管理的Mapper接口方法标记为事务方法,在Service实现类中调用这些方法时,Spring会自动开启一个数据库事务,将这些方法作为一个事务来执行。如果其中任何一个方法执行失败,整个事务将回滚。这种方法可以确保数据的一致性和完整性,避免了数据异常和数据丢失的情况发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值