1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      mysql怎么支持的事務(wù) mysql如何支持事物

      Mysql數(shù)據(jù)庫中,事務(wù)是指什么?如何使用該功能?

      什么是事務(wù)? \x0d\x0a\x0d\x0a事務(wù)是邏輯上的一組操作,組成這組操作的各個單元,要不全都成功要不全都失敗,這個特性就是事務(wù) \x0d\x0a\x0d\x0a注意:mysql數(shù)據(jù)支持事務(wù),但是要求必須是innoDB存儲引擎 \x0d\x0a\x0d\x0a解決這個問題: \x0d\x0a\x0d\x0amysql的事務(wù)解決這個問題,因?yàn)閙ysql的事務(wù)特性,要求這組操作,要不全都成功,要不全都失敗,這樣就避免了某個操作成功某個操作失敗。利于數(shù)據(jù)的安全 \x0d\x0a\x0d\x0a如何使用: \x0d\x0a\x0d\x0a(1)在執(zhí)行sql語句之前,我們要開啟事務(wù) start transaction; \x0d\x0a\x0d\x0a(2)正常執(zhí)行我們的sql語句 \x0d\x0a\x0d\x0a(3)當(dāng)sql語句執(zhí)行完畢,存在兩種情況: \x0d\x0a\x0d\x0a1,全都成功,我們要將sql語句對數(shù)據(jù)庫造成的影響提交到數(shù)據(jù)庫中,committ \x0d\x0a\x0d\x0a2,某些sql語句失敗,我們執(zhí)行rollback(回滾),將對數(shù)據(jù)庫操作趕緊撤銷 \x0d\x0a\x0d\x0a(注意:mysql數(shù)據(jù)支持事務(wù),但是要求必須是innoDB存儲引擎) \x0d\x0amysql create table bank(name varchar(20),money decimal(5,1))engine=innodb defau \x0d\x0alt charset=utf8; \x0d\x0a\x0d\x0amysql inset into bank values('shaotuo',1000),('laohu',5000); \x0d\x0a\x0d\x0amysql select*from bank; \x0d\x0a+---------+--------+ \x0d\x0a| name | money | \x0d\x0a+---------+--------+ \x0d\x0a| shaotuo | 1000.0 | \x0d\x0a| laohu | 5000.0 | \x0d\x0a+---------+--------+ \x0d\x0a\x0d\x0a------沒有成功“回滾”執(zhí)行rollback \x0d\x0amysql start transaction; //開啟事務(wù) \x0d\x0aQuery OK, 0 rows affected (0.00 sec) \x0d\x0a\x0d\x0amysql update bank set money=money+500 where name='shaotuo'; \x0d\x0aQuery OK, 1 row affected (0.00 sec) \x0d\x0aRows matched: 1 Changed: 1 Warnings: 0 \x0d\x0a\x0d\x0amysql update bank set moey=money-500 where name='laohu'; \x0d\x0aERROR 1054 (42S22): Unknown column 'moey' in 'field list' \x0d\x0amysql rollback; //只要有一個不成功,執(zhí)行rollback操作 \x0d\x0aQuery OK, 0 rows affected (0.01 sec) \x0d\x0a\x0d\x0amysql select*from bank; \x0d\x0a+---------+--------+ \x0d\x0a| name | money | \x0d\x0a+---------+--------+ \x0d\x0a| shaotuo | 1000.0 | \x0d\x0a| laohu | 5000.0 | \x0d\x0a+---------+--------+ \x0d\x0a------成功之后 進(jìn)行commit操作 \x0d\x0amysql start transaction; //開啟事務(wù) \x0d\x0aQuery OK, 0 rows affected (0.00 sec) \x0d\x0a\x0d\x0amysql update bank set money=money+500 where name='shaotuo'; \x0d\x0aQuery OK, 1 row affected (0.01 sec) \x0d\x0aRows matched: 1 Changed: 1 Warnings: 0 \x0d\x0a\x0d\x0amysql update bank set money=money-500 where name='laohu'; \x0d\x0aQuery OK, 1 row affected (0.00 sec) \x0d\x0aRows matched: 1 Changed: 1 Warnings: 0 \x0d\x0a\x0d\x0amysql commit; //兩個都成功后執(zhí)行commit(只要不執(zhí)行commit,sql語句不會對真實(shí)的數(shù)據(jù)庫造成影響) \x0d\x0aQuery OK, 0 rows affected (0.05 sec) \x0d\x0a\x0d\x0amysql select*from bank; \x0d\x0a+---------+--------+ \x0d\x0a| name | money | \x0d\x0a+---------+--------+ \x0d\x0a| shaotuo | 1500.0 | \x0d\x0a| laohu | 4500.0 | \x0d\x0a+---------+--------+

      在中站等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站建設(shè)、成都網(wǎng)站制作 網(wǎng)站設(shè)計制作按需求定制設(shè)計,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都全網(wǎng)營銷推廣,成都外貿(mào)網(wǎng)站制作,中站網(wǎng)站建設(shè)費(fèi)用合理。

      如何配置mysql支持事務(wù)

      MYSQL--事務(wù)處理

      事務(wù)處理在各種管理系統(tǒng)中都有著廣泛的應(yīng)用,比如人員管理系統(tǒng),很多同步數(shù)據(jù)庫操作大都需要用到事務(wù)處理。

      比如說,在人員管理系統(tǒng)中,你刪除一個人員,你即需要刪除人員的基本資料,也要刪除和該人員相關(guān)的信息,如信箱,文章等等,這樣,這些數(shù)據(jù)庫操作語句就構(gòu)成一個事務(wù)!

      一文詳解-MySQL 事務(wù)和鎖

      當(dāng)多個用戶訪問同一份數(shù)據(jù)時,一個用戶在更改數(shù)據(jù)的過程中,可能有其他用戶同時發(fā)起更改請求,為保證數(shù)據(jù)庫記錄的更新從一個一致性狀態(tài)變?yōu)榱硗庖粋€一致性狀態(tài),使用事務(wù)處理是非常必要的,事務(wù)具有以下四個特性:

      MySQL 提供了多種事務(wù)型存儲引擎,如 InnoDB 和 BDB 等,而 MyISAM 不支持事務(wù)。為了支持事務(wù),InnoDB 存儲引擎引入了與事務(wù)處理相關(guān)的 REDO 日志和 UNDO 日志,同時事務(wù)依賴于 MySQL 提供的鎖機(jī)制

      事務(wù)執(zhí)行時需要將執(zhí)行的事務(wù)日志寫入日志文件,對應(yīng)的文件為 REDO 日志。當(dāng)每條 SQL 進(jìn)行數(shù)據(jù)更新操作時,首先將 REDO 日志寫進(jìn)日志緩沖區(qū)。當(dāng)客戶端執(zhí)行 COMMIT 命令提交時,日志緩沖區(qū)的內(nèi)容將被刷新到磁盤,日志緩沖區(qū)的刷新方式或者時間間隔可以通過參數(shù) innodb_flush_log_at_trx_commit 控制

      REDO 日志對應(yīng)磁盤上的 ib_logifleN 文件,該文件默認(rèn)為 5MB,建議設(shè)置為 512MB,以便容納較大的事務(wù)。MySQL 崩潰恢復(fù)時會重新執(zhí)行 REDO 日志的記錄,恢復(fù)最新數(shù)據(jù),保證已提交事務(wù)的持久性

      與 REDO 日志相反,UNDO 日志主要用于事務(wù)異常時的數(shù)據(jù)回滾,具體內(nèi)容就是記錄數(shù)據(jù)被修改前的信息到 UNDO 緩沖區(qū),然后在合適的時間將內(nèi)容刷新到磁盤

      假如由于系統(tǒng)錯誤或者 rollback 操作而導(dǎo)致事務(wù)回滾,可以根據(jù) undo 日志回滾到?jīng)]修改前的狀態(tài),保證未提交事務(wù)的原子性

      與 REDO 日志不同的是,磁盤上不存在單獨(dú)的 UNDO 日志文件,所有的 UNDO 日志均存在表空間對應(yīng)的 .ibd 數(shù)據(jù)文件中,即使 MySQL 服務(wù)啟動了獨(dú)立表空間

      在 MySQL 中,可以使用 BEGIN 開始事務(wù),使用 COMMIT 結(jié)束事務(wù),中間可以使用 ROLLBACK 回滾事務(wù)。MySQL 通過 SET AUTOCOMMIT、START TRANSACTION、COMMIT 和 ROLLBACK 等語句支持本地事務(wù)

      MySQL 定義了四種隔離級別,指定事務(wù)中哪些數(shù)據(jù)改變其他事務(wù)可見、哪些數(shù)據(jù)該表其他事務(wù)不可見。低級別的隔離級別可以支持更高的并發(fā)處理,同時占用的系統(tǒng)資源更少

      InnoDB 系統(tǒng)級事務(wù)隔離級別可以使用以下語句設(shè)置:

      查看系統(tǒng)級事務(wù)隔離級別:

      InnoDB 會話級事務(wù)隔離級別可以使用以下語句設(shè)置:

      查看會話級事務(wù)隔離級別:

      在該隔離級別,所有事務(wù)都可以看到其他未提交事務(wù)的執(zhí)行結(jié)果。讀取未提交的數(shù)據(jù)稱為臟讀(Dirty Read),即是:首先開啟 A 和 B 兩個事務(wù),在 B 事務(wù)更新但未提交之前,A 事務(wù)讀取到了更新后的數(shù)據(jù),但由于 B 事務(wù)回滾,導(dǎo)致 A 事務(wù)出現(xiàn)了臟讀現(xiàn)象

      所有事務(wù)只能看見已經(jīng)提交事務(wù)所做的改變,此級別可以解決臟讀,但也會導(dǎo)致不可重復(fù)讀(Nonrepeatable Read):首先開啟 A 和 B 兩個事務(wù),A事務(wù)讀取了 B 事務(wù)的數(shù)據(jù),在 B 事務(wù)更新并提交后,A 事務(wù)又讀取到了更新后的數(shù)據(jù),此時就出現(xiàn)了同一 A 事務(wù)中的查詢出現(xiàn)了不同的查詢結(jié)果

      MySQL 默認(rèn)的事務(wù)隔離級別,能確保同一事務(wù)的多個實(shí)例在并發(fā)讀取數(shù)據(jù)時看到同樣的數(shù)據(jù)行,理論上會導(dǎo)致一個問題,幻讀(Phontom Read)。例如,第一個事務(wù)對一個表中的數(shù)據(jù)做了修改,這種修改會涉及表中的全部數(shù)據(jù)行,同時第二個事務(wù)也修改這個表中的數(shù)據(jù),這次的修改是向表中插入一行新數(shù)據(jù),此時就會發(fā)生操作第一個事務(wù)的用戶發(fā)現(xiàn)表中還有沒有修改的數(shù)據(jù)行

      InnoDB 通過多版本并發(fā)控制機(jī)制(MVCC)解決了該問題:InnoDB 通過為每個數(shù)據(jù)行增加兩個隱含值的方式來實(shí)現(xiàn),這兩個隱含值記錄了行的創(chuàng)建時間、過期時間以及每一行存儲時間發(fā)生時的系統(tǒng)版本號,每個查詢根據(jù)事務(wù)的版本號來查詢結(jié)果

      通過強(qiáng)制事務(wù)排序,使其不可能相互沖突,從而解決幻讀問題。簡而言之,就是在每個讀的數(shù)據(jù)行上加上共享鎖實(shí)現(xiàn),這個級別會導(dǎo)致大量的超時現(xiàn)象和鎖競爭,一般不推薦使用

      為了解決數(shù)據(jù)庫并發(fā)控制問題,如走到同一時刻客戶端對同一張表做更新或者查詢操作,需要對并發(fā)操作進(jìn)行控制,因此產(chǎn)生了鎖

      共享鎖的粒度是行或者元組(多個行),一個事務(wù)獲取了共享鎖以后,可以對鎖定范圍內(nèi)的數(shù)據(jù)執(zhí)行讀操作

      排他鎖的粒度與共享鎖相同,一個事務(wù)獲取排他鎖以后,可以對鎖定范圍內(nèi)的數(shù)據(jù)執(zhí)行寫操作

      有兩個事務(wù) A 和 B,如果事務(wù) A 獲取了一個元組的共享鎖,事務(wù) B 還可以立即獲取這個元組的共享鎖,但不能獲取這個元組的排他鎖,必須等到事務(wù) A 釋放共享鎖之后。如果事務(wù) A 獲取了一個元組的排他鎖,事務(wù) B 不能立即獲取這個元組的共享鎖,也不能立即獲取這個元組的排他鎖,必須等到 A 釋放排他鎖之后

      意向鎖是一種表鎖,鎖定的粒度是整張表,分為意向共享鎖和意向排他鎖。意向共享鎖表示一個事務(wù)有意對數(shù)據(jù)上共享鎖或者排他鎖。有意表示事務(wù)想執(zhí)行操作但還沒真正執(zhí)行

      鎖的粒度主要分為表鎖和行鎖

      表鎖的開銷最小,同時允許的并發(fā)量也是最小。MyISAM 存儲引擎使用該鎖機(jī)制。當(dāng)要寫入數(shù)據(jù)時,整個表記錄被鎖,此時其他讀/寫動作一律等待。一些特定的動作,如 ALTER TABLE 執(zhí)行時使用的也是表鎖

      行鎖可以支持最大的并發(fā),InnoDB 存儲引擎使用該鎖機(jī)制。如果要支持并發(fā)讀/寫,建議采用 InnoDB 存儲引擎

      如何開啟mysql的事務(wù)支持

      看你是什么事務(wù),jdbc事務(wù),還是分布式事務(wù),還是容器事務(wù)

      1,編程式事務(wù)管理(jdbc的事務(wù)是綁定在connection上的)

      Connection conn = null;

      try

      {

      Class.forName("com.mysql.jdbc.Driver");

      conn = DriverManager.getConnection("jdbc:oracle:thin:@host:1521:SID","username","password");

      conn.setAutoCommit(false); //取消自動提交

      PreparedStatement ps = conn.prepareCall("update something");

      ResultSet rs = ps.executeQuery();

      conn.commit(); //手動提交

      }

      catch (Exception e)

      {

      conn.rollback();

      e.printStackTrace();

      }

      finally

      {

      conn.close();

      }

      2,聲明式事務(wù)

      先在工程的application.xml配置文件中添加如下代碼,開啟事務(wù)

      !-- 聲明式事務(wù)控制配置 --

      tx:annotation-driven transaction-manager="txManager"/

      bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"

      property name="datasource" ref="bassDataSource"/property

      /bean

      然后在你需要開啟事務(wù)的接口前面添加注解

      @Transactional(rollbackFor = IOException.class)

      public void add(String name) throws IOException

      {

      System.out.println("可以再類里和方法里面添加事務(wù)注解0~0");

      throw new IOException();

      }

      直接調(diào)用接口方法就好

      分布式事務(wù)處理(mysql貌似在5.X之后才支持) 的話,

      1.可以直接使用spring+atomikos框架進(jìn)行管理

      參考:

      就不貼測試代碼了,自己看著配置吧

      2,使用JTA(Java Transaction API)進(jìn)行分布式事務(wù)管理(測試代碼如下)

      import java.sql.Connection;

      import java.sql.PreparedStatement;

      import java.sql.SQLException;

      import javax.naming.InitialContext;

      import javax.sql.DataSource;

      import javax.transaction.SystemException;

      import javax.transaction.UserTransaction;

      import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

      //分布式事務(wù)處理

      public class transferAccount

      {

      @SuppressWarnings("null")

      public void testTransferAccount()

      {

      UserTransaction userts = null;

      Connection connA = null;

      PreparedStatement psA = null;

      InitialContext context = null;

      Connection connB = null;

      PreparedStatement psB = null;

      try

      {

      //獲得事務(wù)管理對象

      userts = (UserTransaction) context.lookup("java:comp/UserTransaction");

      //獲取兩個數(shù)據(jù)庫

      connA = getDataSourceA().getConnection();

      connB = getDataSourceB().getConnection();

      //開啟事務(wù)

      userts.begin();

      //sql語句

      psA = connA.prepareStatement("我加1");

      psB = connB.prepareStatement("我減1");

      //執(zhí)行sql

      psA.executeUpdate();

      psB.executeUpdate();

      //事務(wù)提交

      userts.commit();

      } catch (Exception e)

      {

      try

      {

      userts.rollback();

      } catch (IllegalStateException | SecurityException

      | SystemException e1)

      {

      e1.printStackTrace();

      }

      e.printStackTrace();

      }

      finally

      {

      try

      {

      psA.close();

      psB.close();

      connA.close();

      connB.close();

      } catch (SQLException e)

      {

      e.printStackTrace();

      }

      }

      }

      public DataSource getDataSourceA()

      {

      MysqlDataSource dataSource = new MysqlDataSource();

      dataSource.setDatabaseName("mysql");

      dataSource.setServerName("server");

      dataSource.setPortNumber(1433);

      dataSource.setUser("test");

      dataSource.setPassword("test");

      return dataSource;

      }

      public DataSource getDataSourceB()

      {

      MysqlDataSource dataSource = new MysqlDataSource();

      dataSource.setDatabaseName("mysql");

      dataSource.setServerName("server");

      dataSource.setPortNumber(1435);

      dataSource.setUser("test1");

      dataSource.setPassword("test1");

      return dataSource;

      }

      }


      當(dāng)前文章:mysql怎么支持的事務(wù) mysql如何支持事物
      分享URL:http://ef60e0e.cn/article/doggojj.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        清水县| 彭山县| 张家口市| 南澳县| 庄浪县| 台湾省| 通榆县| 涞源县| 平南县| 连南| 古田县| 稷山县| 庆城县| 留坝县| 辰溪县| 中江县| 定州市| 泸溪县| 藁城市| 桃江县| 莎车县| 泰宁县| 盐边县| 财经| 无棣县| 普定县| 雅安市| 称多县| 澄江县| 兴化市| 沧州市| 将乐县| 西青区| 肇东市| 清水县| 宾阳县| 英超| 佛坪县| 平塘县| 清徐县| 舒城县|