事物管理

事务是指一组操作,组成这组操作的功能,要不全都成功,要不全不成功.

      产于事务
            1.数据库本向是提供事务.
            2.jdbc提供对事务的处理.
     
      1.数据库中事务处理     
            mysql事务是自动提交的.-----默认情况,事务自动提交。一条sql语句是一个单独事务
            oracle事务是手动提交.   

            start transaction  ------开启事务
            rollback                    ------回滚
            commit                        ------提交事务

            mysql可不可以设置提交方式?
                  show variables like '%commit%'; 查看提交方式
                  set autocommit=off/on; 关闭自动提交
     
            演示  start transaction    rollback    commit使用
           
            create table account(
                id int primary key auto_increment,
                name varchar(20),
                money double
            );

            insert into account values(null,'aaa',1000);
            insert into account values(null,'bbb',1000);
            insert into account values(null,'ccc',1000);

            aaa----bbb 汇款500块.
            update account set money=money-500 where name='aaa'; 从aaa减去500.
            update account set money=money+500 where name='bbbb'; 给bbb加上500.
           
            事务处理操作
            1.start transaction.
            2.
            update account set money=money-500 where name='aaa'; 从aaa减去500.
            update account set money=money+500 where name='bbbb'; 给bbb加上500.
            3.发现数据有问题
                  rollback
            4.commit。

      2.jdbc事务处理
           
            在Connection中提供
                  setAutoCommit(boolean f) ---设置事务的提交方式.
                  rollback()    --------------事务回滚.
                  commit() ------------------事务提交.
                  这三个方法是jdbc中事务处理的三个方法
                 
                  Savepoint 回滚点
                 
                  con.setSavepoint();获取

                  回滚时 rollback(savepoint);
-----------------------------------------------------------------------
事务的特性(ACID)
      1.原子性
      2.一致性
      3.隔离性
      4.持久性
     
重点介绍事务隔离性
      如果不考虑隔离性会引发的问题
           
            1.脏读  一个事务读取到另一个事务的未提交数据.
                  A 转账 给B 100,未提交
                  B 查询账户多了100
                  A 回滚
                  B 查询账户那100不见了


            2.不可重复读  两次读取的数据不一致.(强调是update操作,数据总条数不变)
                 
                  将隔离级别设置成 Read committed.查看是否可以解决脏读问题.
           
                  演示不可重复读.

                  A 转账 给B 100,未提交
                  B 查询 金额没变
                  A 提交数据
                  B查询,发现金额多了100

                  两次读取到的数据不一致.出现了不可重复读.
                 
                 
            3.虚读(幻读)  两次读取的数据不一致.(强调是insert操作,数据总条数改变)

                 

      事务的隔离级别
            数据库中一共有四种隔离级别
            1 Serializable:可避免脏读、不可重复读、虚读情况的发生。(串行化)
            2 Repeatable read:可避免脏读、不可重复读情况的发生。(可重复读)不可以避免虚读
            3 Read committed:可避免脏读情况发生(读已提交)
            4 Read uncommitted:最低级别,以上情况均无法保证。(读未提交)
     
      mysql默认的隔离级别是什么?怎样设置隔离级别?

            mysql默认隔离级别是Repeatable read级别.

           
            操作数据库内部隔离级别
            set session transaction isolation level 设置事务隔离级别
            select @@tx_isolation      查询当前事务隔离级别


            set session transaction isolation level Repeatable read;

     
            serializable会出现锁表情况。

            安全性:serializable > repeatable read > read committed > read uncommitted
            性能 :serializable < repeatable read < read committed < read uncommitted

            数据库隔离级别:repeatable read

----------------------------------------------------------------------------
JDBC设置事务的隔离级别
     
      在Connection接口中提供

      setTransactionIsolation(int level)用来设置事物的隔离级别

      以下是Connection提供的四个级别字段
      Connection.TRANSACTION_READ_COMMITTED
      Connection.TRANSACTION_READ_UNCOMMITTED
      Connection.TRANSACTION_REPEATABLE_READ
      Connection.TRANSACTION_SERIALIZABLE


事务的丢失败更新问题

      什么是更新丢失
            两个或多个事务更新同一行,但这些事务彼此之间都不知道其它事务进行的修改,
                    因此第二个更改覆盖了第一个修改
     
      数据库采用什么样的机制解决更新丢失问题
           
            1.悲观锁(永远会发生)
                  利用数据库中的内部锁机制(行级别锁)
                 
                  分为
                 
                  读锁(共享锁)        lock in share mode    可以在一行上添加多个
                 
                  写锁(排它锁)        for update                  只能有一个.

                  update 语句默认添加的是排它锁.

                  锁必须在事务中添加,如果commit,锁自动释放.
           
           
            2.乐观锁(永远不会发生)
                  添加版本字段解决丢失更新问题


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值