事物的理解

MySQL事物:
事物(Transaction):一组SQL语句操作单元,组内所有的SQL语句完成你一个业务逻辑.如果整租成功,意味着全部的SQL都实现.如果其中任何一个失败,意味着整个操作失败.
失败:意味着整个过程没有意义.应当把数据库回到操作前的初始状态.
所以:事物是指逻辑上的一组操作,组成操作的各个单元,要不全成功要不全失败.

举个例子:
比如一个下单过程,从个人账户扣除50元,到orderlist表里增加50元

update useraccount set user_money = user_money -50 where id =1;
update orderlist set user_money = user_money + 50 where id = 1;

大家思考这样的一个问题:在一个完整的下单过程.如果出现这样的情况时,当第一条语句正确执行后,出现断电,逻辑错误等,反正第三个语句不能正确执行.会出现什么问题?
是不是出现:我付款了,商家没有收到钱。导致商家不发货?
所以在MySQL中回有由事物处理;
如何处理?
1.失败后,可以回到开始的位置.
2.没有成功前,别的用户(进程,会话)中不能看到操作内的数据修改的

思路:就是一组操作之间,设计一个记号,备份点。
设置记号1
第一步完成后,
设置一个记号2
然后执行第二步,
第二步成功,提交,让别人看到数据的修改。
第二步失败,别人看不到数据的修改,而且回到起点1的位置。
实现:是利用innodb存储引擎的事物日志功能.

存在事物日志里,如果成功,则将结果提交到数据库内,做持久化保存,这就意味着修改了数据的内容.


*SQL的执行分为二个阶段:

  1. 执行阶段
  2. 将执行结果提交给数据库的阶段
    其中:我们的事物日志,就是保存执行阶段的结果,如果以提交,则将执行结果提交给数据库。如果不提交,则回到起点。

提交方式: 自动提交. 执行完毕后,自动完成提交工作.
因此需要关闭自动提交的功能.
查看mysql的自动提交是否关闭:

show variables like 'autocommit';
set autocommit = 1 ; 开启自动提交
set autocommit = 0 ; 关闭自动提交

开始一个下订单的过程。

第一个执行:

update useraccount set user_money = user_money - 50 where id = 1;

第二个执行:

update orderlist set order_money = order_money + 50 where id = 1;

二种情况:

二中情况:
成: 将结果提交.利用commit提交
败: 将回到开始的位置. 利用rollback返回


常见的MySQL的事物指令
MySQL是手动开启事物,所以:
start transaction : 开启事物,关闭自动提交
成功: commit;
失败: rollback
限定: InnoDB下生效

事物的特点:

  1. 原子性(atomicity)
    事物是一个不可分割的的工作单元,事物中的操作要么发生,要么不发生.与某个事务关联的操作具有共同的目标,并且是相互依赖的。如果系统只执行这些操作的一个子集,则可能会破坏事务的总体目标。原子性消除了系统处理操作子集的可能性。
  2. 一致性(consistency)
    事物前后必须保持数据的一致性和完整性.
  3. 隔离性(isolation)
    多个用户并发访问数据库时,一个用户的事物不能被其它的用户的事物干扰,多个并发事务之间的数据要相互隔离。
  4. 持久性(durability)
    一个事物一旦被提交.它对数据库中的数据改变是永久的,该修改即使出现致命的系统故障也将一直保持。

处理模型
事物有三种模型:
1.隐式事物是指每一条数据库操作语句都自动地成为一个事物,事物的开始是隐式的,事物结束有明确得到标记.
2.显示事物是指有明显式的开始和结束标记的事物,每个事物有显式的开始和结束标记.
3.自动事务是系统自动默认的,开始和结束不用标记

Oracle的事物(Transaction)
其事物跟MySQL的事物基本相似,其区别是
开启事务的方式:
MySQL: 手动开启事物
oracle: 自动开启事物

事物的补充: 事物的起始标志:
事物中第一套DML语句
事物结束标志:
提交: (*) 显示提交: commit
(*)隐式提交: 正常退出exit, DDL, DCL
回滚: (*)显示提交: rollback
(*)隐式回滚: 非正常退出, 宕机
事物本质?什么叫提交事物?
将DML操作日志成功写入日志文件

redis中的事物: 不是真正的事物,本质是:把一组操作放入一个对垒中,一起执行.
对比Oracle和Redis中事物
Oracle Redis
事物开启方式: 自动开启方式 multis
操作: DML Redis命令
提交事务: commit exec —-> 把一组操作放入一个队列中
回滚事物: rollback discard
Redis事物的三个阶段:
开启: 以multis开始为第一事物
入队: 将多个命令入队到事物中,接到这些命令不会立即执行,而是放到等待执行的事物队列里面
执行: 由exec命令执行

三个特性

1.单独隔离性操作:
事物中的所有命令都会序列化,按顺序地执行.事物在执行的过程中,不会被其他客户端发送来的命令请求打断
2.没有隔离级别的概念
队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在“事务内的查询要看到事务里的更新,在事务外查询不能看到”这个让人万分头痛的问题。
3. rdis同一个事物如果有一条命令执行失败,其后的命令仍然执行,没有回滚


补充:
DML(data manipulation language):
它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言
DDL(data definition language):
DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用
DCL(Data Control Language):

锁:
Java :synchronized lock
锁: 计算机协调或线程并发访问某个资源的机制
数据是提供多个用户共享的资源
锁冲突也是影响数据里并发性能一个重要的因素.

(1) MyISAM和Memory存储引擎: 表现锁
(2)InnoDB :即支持表现级锁(table-level locking),行级锁(row-level locking), 默认情况下,行级锁

表现锁:
开销小,加锁快,不会出现死锁,锁的粒度大,发生锁的冲突概率高,并发性能最低.

行级锁:
开销大,加锁慢,会出现死锁,锁的粒度小,发生锁的冲突概率最低,并发性能最高.

怎样避免死锁?

  1. 如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会
  2. 在同一个事物中,尽可能做到一次锁定锁需要的所有的资源,减少锁产生的概率
  3. 对于非常产生死锁业务,可以尝试使用升级锁定的颗粒度,通过表现锁来减少死锁的概率.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值