基础知识
(1)事务用以维护MYSQL数据的完整性,保证成批的操作要么全部执行,要么全部不执行
(2)事务的ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
(3)MYSQL只有Innodb的数据表支持事务;
Innodb的隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | 会发生 | 会发生 | 会发生 |
读提交 | 不会发生 | 会发生 | 会发生 |
可重复读 | 不会发生 | 不会发生 | 会发生 |
串行化 | 不会发生 | 不会发生 | 不会发生 |
脏读:读取了其他事务未修改完的记录;
不可重复读:因为被其它事务修改了记录导致某事务两次读取记录不一致;
幻读:因为其它事务对表做了增删导致某事务两次读取的表记录数不一致问题。
设置隔离级别命令
mysql默认的事务处理级别是'REPEATABLE-READ' -- 可重复读
(1)查看当前会话隔离级别
select @@tx_isolation;
(2)查看系统当前隔离级别
select @@global.tx_isolation;
(3)设置当前会话隔离级别
set session transaction isolation level repeatable read;
(4)设置系统当前隔离级别
set global transaction isolation level repeatable read;
事务的处理方法
(1)命令
BEGIN #开始一个事务
COMMIT #提交事务
ROLLBACK #事务回滚
(2)设置自动提交
mysql默认是自动提交的
SET AUTOCOMMIT=0 #禁止自动提交
SET AUTOCOMMIT=1 #开启自动提交
数据库加锁
表锁
给表加读写锁之后需手动unclock tables,用commit不会自动解锁
(1)加写锁
lock table user write;
(2)加读锁
lock table user read;
(3)加读锁,支持另一个事务insert
lock table user read local;
(3)解除表锁
unclock tables
行锁
行锁在提交事务后自动解锁
(1)加共享行锁
select * from user where id=2 lock in share mode;
(2)加排他行锁
select * from user where id=2 for update;
数据库插入的优化方法
(1)concurrent_insert
MyISAM里的读写是串行的,可以并行处理查询和插入
当concurrent_insert=0时,不允许并发插入功能。
当concurrent_insert=1时,允许对没有洞洞的表使用并发插入,新数据位于数据文件结尾(缺省)。
当concurrent_insert=2时,不管表有没有洞洞,都允许在数据文件结尾并发插入。
(2)max_write_lock_count
缺省情况下,写操作的优先级要高于读操作的优先级,即便是先发送的读请求,后发送的写请求,此时也会优先处理写请求,然后再处理读请求。这就造成一 个问题:一旦我发出若干个写请求,就会堵塞所有的读请求,直到写请求全都处理完,才有机会处理读请求
max_write_lock_count=1
有了这样的设置,当系统处理一个写操作后,就会暂停写操作,给读操作执行的机会
(3)low-priority-updates
与max_write_lock_count遇到的情况相同,通过降低写的优先级来实现
low-priority-updates=1
参考网址:
https://blog.csdn.net/weixin_30649641/article/details/101624689
https://blog.csdn.net/ty497122758/article/details/60349595
https://www.runoob.com/mysql/mysql-transaction.html
https://www.cnblogs.com/hurry-up/p/7541585.html