MYSQL之事务的简单理解

一、 事务概念
a) 用于处理一件事情的最小的独立单元,在数据库中,一个事务可以是一个sql语句,也可以是多条sql语句组成一个单元,例如:去银行转账,如果需要将账户A的100元转到账户B中,需要将账户A的钱减100,然后将账户B的钱加100,在处理事务时,首先事务开启(begin),处理若干逻辑sqlA,sqlB(增,删,改sql语句),如果处理成功需要事务提交(commit),并修改生效,. 如果发生异常需要事务回滚(rollback),sqlA和sqlB将都不生效
b) 事务的特征
i. 原子性:每一个事务都是一个不可再分割的独立单元
ii. 一致性:保持数据的一致性,在处理多条sql语句时,sqlA和sqlB要么全部成功,要么全部失败
iii. 隔离性:对于多个事务之间,每个事务相互独立,事务与事务之间隔离,根据数据库隔离级别的不同,数据的隔离级别也不一样
iv. 持久性: 事务一旦提交commit,就永久保存在数据库磁盘中
c) 在mysql中如何体现事务呢?
i. Mysql的事务提交默认是 自动提交 ,Mysql的查询引擎 MyISAM不支持事务,INNODB支持事务, 对于自动提交的事务 增删改自动commit不能rollback
ii. 需要设置数据库事务手动提交
在当前连接中:Set autocommit=0 手动 set autocommit=1 自动提交
查看事务的提交状态:
Show variables like ‘autocommit’ ;
一个事务在进行增,删,改时,对于INNODB方式会分配一个锁,锁包含
1、 共享锁:称为 读锁,可以允许多个事务并发读取同一个资源,如果一个事务T对数据A增加了共享 锁,那么其他事务可以读取数据A,但是不能对其进行增,删,改的操作 ,加了共享锁的事务不能再增加排他锁。
2、 排他锁:称为 写锁,如果事务T对数据A增加排他锁,那么其他事务不能对数据A 进行 读,写操作
D) 数据库的隔离性
对于多个事务之间存在不同的隔离级别,隔离级别不同,在事务并发时存在一些问题
一个用户操作对应一个事务

假设用户A对tb_user插入一条记录 insert 还未提交,测试 用户B对tb_user查询,试问用户B能否查询到数据? 与数据库的事务隔离级别有关,如果此时数据库设置隔离级别为 “transcation_read_uncommitted” ,则以上案例用户B可以查询,如果设置“transcation_read_committed”或其他更高设置,则用户B不可以查询到。

隔离级别的不同可能产生以下问题:
1、 脏读: 一个事务读取另一个并发事务还未提交的数据
2、 不可重复读: 一个事务再次读取之前的事务时,两次读取的数据不一致 ,原因是被另一个事务修改了。(侧重修改)
3、 幻读: 一个事务重新读取查询时,返回的数据比上一次数据 会增加或减少记录(侧重于插入,删除)
Isolation :隔离级别
事务隔离级别 脏读 不可重复读 幻读
读未提交数据Transaction_read_uncommitted 是 是 是
读已提交数据(不可重复读) transaction_read_committed 否 是(前后不一致) 是
可重复读 transaction_repeatable_read 否 否(前后一致) 是
串行化(Serializable) 否 否 否

Mysql中默认隔离级别是 可重复读
Oracle中默认隔离级别是: 读已提交数据
设置mysql 的隔离别:
Select @@tx_isolation
1 Set session transaction isolation level read uncommitted;

2 读取已提交数据
Read committed

问题1:读已提交(不可重复读 readcommitted) 和 可重复的 的区别(reapeatable read) ,区别:
他们都可能产生 幻读,都不可能产生脏读
当对并发数据修改过程中时, read committed 在修改过程中,前后不一致
可重复读 ,修改之前,和修改过程中是前后一致 ,但是提交之后,前后不一致(已经修改了)

串行事务 效率很低,在事务对数据A操纵时,其他任意事务都不能对其操纵。

二、 JDBC的事务提交
JDBC对数据修改,添加,删除默认是 自动提交,也可以修改配置将事务设置成手动提交。
Connetion conn = DriverManager.getConnection(url,user,pasword),
Conn.setAutoCommit(false) : 手动提交

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值