mysql事务

mysql事务,第1张

mysql事务

MySQL事务
  • 事务隔离级别
  • 问题
  • 样例
    • 读未提交(read uncommitted)
    • 读已提交(read committed)
    • 可重复读(repeatable read)
    • 串行化(serializable)
  • 部分SQL

事务隔离级别
  • 读未提交(read uncommitted): 一个事务还没提交,它的变更就能被其它事务看到
  • 读已提交(read committed) 一个事务提交后,其变更才会被其他事务看到
  • 可重复读(repeatable read) 一个事务执行过程中看到的数据,和该事务在启动时看到的数据一致。自然未提交的变更对其他事务也是不可见的。一个事务启动时,能够看到所有已提交的事务结果。但之后的该事务执行期间,其他事务的更新对它就不可见了
  • 串行化(serializable) 对同行记录,“写”加“写锁”,“读”加“读锁”。出现读写锁冲突时,后访问的事务必须等前一个事务执行完成
问题
  • 脏读:在事务A读取了事务B中已修改但未提交的数据
  • 不可重复读:当有事务A对某记录需要多次查询;而事务B在其中对该记录修改并提交,那么事务A则会出现前后读取到的数据不一致
  • 幻读:当同一个查询在不同时间产生不同的行集时,所谓的幻影问题就会发生在一个事务中。 例如,如果 SELECt 执行两次,但第二次返回第一次未返回的行,则该行是“幻影”行;这里按照我的l理解不是在该事务中返回结果不一致;而是在插入时会提示已存在该记录,但是实际上是没有查出来,因此这一行是"幻影";如果两次的查询第一次返回10条第二次返回11条,这个应属于不可重复读
样例 读未提交(read uncommitted)

存在脏读、不可重复读、幻读的问题
脏读样例:

读已提交(read committed)

解决脏读的问题,存在不可重复读、幻读的问题
不可重复读样例:

可重复读(repeatable read)

解决脏读、不可重复读的问题,存在幻读的问题
这里说一下不可重复读:虽然在会话一中查不到会话二对中该记录的修改,但是实际上是已经修改的,因此如果是会话一在此时使用UPDATE或者DELETE则不会命中,这种情况则是幻读了;
update test set name = 3 where id = 1 and name = 1;
幻读样例:

串行化(serializable)

解决脏读、不可重复读、幻读;但性能最低
串行化样例:(估计有些地方不对)

部分SQL
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT
	@@tx_isolation;
	
	
BEGIN;
	SELECT NAME 
	FROM
		test 
	WHERe
		id = 1;
		
		
		
	INSERT INTO test ( NAME, id )
	VALUES
	( '1', 1 );
COMMIT;

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5660073.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存