(5)事务 个人理解总结

事务

事务就是绑定了多条或者一条sql语句,这些语句要不全部成功,要不全部失败

四大特性:

原子性(不可分割)
一致性(执行后数据库状态与其他业务规则要保持一致,比如转账业务加的和扣的应该一样)
隔离性(并发操作时,不同事物要隔离开,不发生干扰)
持久性(一旦事务提交成功,所有操作都要持久化到数据库中,也就是可以回滚)

数据库的隔离级别

如果多个事务访问相同数据,没有采取隔离机制的话就会导致各种并发问题,隔离性就是解决这个问题的
1.脏读:T1T2两个事务,若T1读取了T2还没有提交的字段,若T2回滚,T1读取的内容无效
2.不可重复读:若T1读取字段后,T2更新,则T1无法再读取到相同内容
3.幻读:若T1读取完之后,T2插入新的行,则读取同一个表就会多出几行
隔离级别有:
read uncommitted读未提交数据 允许事务读取未被其他事务提交的变更,三个问题都会出现
read commited读已提交数据 可避免脏读(在这个事务运行期间只会读到别的事务提交后的)
repeatable read这个事务持续期间,禁止其他事务更新这个字段,可避免脏读和不可重复读(不允许别的事务更新,运行期间别的事务更新后提交了也不改变,直到这个事务结束才改变)
serializable串行化,这个事务持续期间,禁止其他事务更新,增加,删除这个字段,性能低下。(不允许别的事务更新,增加,删除,运行期间别的事务的其他操作提交以后都不会影响当前正在运行的事务)
oracle支持read commited(默认) ,serializable
mysql支持全部4种,默认为repeatble read

开启步骤

在mysql中每条语句都是事务(隐式事务),如果要绑定多个语句,要进行开启(显式事务)
1.取消隐式事务开启(show variables like autocommit 可看到这个是1)
set autocommit =0;
2.开启事务
start transaction;
3.编写语句
xxxx
xxxx
4.结束事务
if(异常){
rollback;}else{
commit

隔离级别演示:

mysql -u root -p进入mysql
select @@transaction_isolation; 查看默认的隔离级别 记得加冒号
set transaction isolation level read committed; 设置当前mysql 连接的隔离级别为读取已提交(用命令行就是因为用命令行可以开启两个连接,而用图形化界面是一个连接)
set global transaction isolation level read committed;
回滚点
savepoint a;
xxxx语句
rollback to a;只回回滚到保存点a,其他的语句不回滚

在jdbc中演示

如果在运行到一半发生异常,则前面的操作不回滚是不行的
就是在获取连接c之后,可以用c的方法c.setAutoCommit(false);来开启事务
然后和正常的jdbc一样。利用c来获得statement或者prestatement,然后用设置参数,执行c.commit() 如果有异常 则转入catch中 这里接的异常是SQLException异常 ,然后用c.rollback(),这个也可以放到trycatch中,最后在finally中关闭c和s或者resultSet
注意所有的c应该都是同一个对象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值