数据库事务,行级锁

事务

一、事务的特性:(符合以下的特性就属于事务)

原子性:事务要么全执行,要么全不执行
一致性:事务执行前后,数据完整性一致
隔离性:一个事务的执行不能被其他事务干扰。      
持久性:指一个事务一旦提交,对数据库中数据的改变是永久性的。(commit)
查看commit自动提交是打开的 show variables like '%auto%';
设为false set autocommit=0;(一个dos窗口就是connection),这是临时设置为false,关闭再打开dos窗口就失效了
autocommit设为false就是不是自动提交了,而是手动提交了,这样就是如果都对的话就是commit,如果有一条不对就可以rollback(回滚)
例如下:
删除empno为1001的员工
可以看到当前dos窗口查不到1001的员工了,但是又打开一个dos窗口可以看到可以查到所以就是没提交(commit)就是没有删除
可以看到rollback可以倒退到删除之前了,可以查到了(注意:rollback就是回滚之前所有的成功语句,比如说1,2,3,4,5这些语句1,3,5成功了2,4失败了,那么rollback就是回滚1,3,5,的语句)
MySQL中常见的数据库引擎有MyISAM、InnoDB、Memory。
mysql默认就是InnoDB引擎,MyISAM不支持事务

二、事务的隔离级别:如下四种

1)Read Uncommitted(读未提交,防止丢失更新)
 
一个事务在执行过程中,既可以访问其他事务未提交的新插入的数据,又可以访问未提交的修改数据。如果一个事务已经开始写数据,则另外一个事务不允许同时进行写操作,但允许其他事务读此行数据。此隔离级别可防止丢失更新。
 
脏读:事务A读取了事务B未提交的数据,事务B却回滚了。
 
2)Read Committed(读已提交,防止脏读)
 
一个事务在执行过程中,既可以访问其他事务成功提交的新插入的数据,又可以访问成功修改的数据。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。此隔离级别可有效防止脏读。
 
3)Repeatable Read(可重复读取,防止不可重复读和脏读)
 
一个事务在执行过程中,可以访问其他事务成功提交的新插入的数据,但不可以访问成功修改的数据。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。此隔离级别可有效防止不可重复读和脏读。
 
4)Serializable(可串行化,都可避免)
 
提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行。此隔离级别可有效防止脏读、不可重复读和幻读。但这个级别可能导致大量的超时现象和锁竞争,在实际应用中很少使用。
mysql默认的就是可重复读(Repeatable Read)
查看隔离级别语句(select @@transaction_isolation; 或者show variables like '%transaction_isolation%';)

1、设置读已提交(不可重复读)

可以看到设置为读已提交是删除之后提交了其他dos才能查到最新的,下面是当前dos窗口没有了1003的信息
另一个dos的1003还在
提交之后就是可以查到最新的,所以就是commit之后读到最新的

2、默认的不设置就是可重复读Repeatable Read,两边数据一样的

如果执行相同的语句未提交会堵塞

 

提交了之后也是删除失败,幻读

3、读未提交(set session transaction isolation level Read Uncommitted;)

可以查到未提交的数据

三、行级锁

1、一个正在查修改,另一个就会被堵塞

2、只有commit之后才会查出来

posted @ 2022-12-19 17:08  花海~  阅读(75)  评论(0)    收藏  举报