为了解决mysqlbing翻译表字段问题而分析frm文件,

出处:kelvin19840813 的博客

这里讲讲SqlServer的隐式事务。(英文Implicit:含蓄的;暗示的;盲从的;)

在运行程序之前需要在mysql数据库中创建test数据库,如下图所示:图片 1

您的支持是对博主最大的鼓励,感谢您的认真阅读。本文版权归作者所有,欢迎转载,但请保留该声明。

隐式事务无需显示开始:不用 Begin Transaction,必须显示结束:以 Commit Transaction 或者 Rollback Transaction 方式结束。

下面是具体是实现程序:

 

语句迭代迭代:SET IMPLICIT_TRANSACTIONS { ON | OFF }

  

很多人都知道mysqlbinlog 解释出来的binlog的 insert , update 是位置相反的 , 还有表字段都是@1 ... @数字 , 很恶心!!!

开了隐式事务后,下面的语句的语句就会自动开启隐式事务。

  1 package News;
  2 
  3 import java.sql.Connection;
  4 import java.sql.DriverManager;
  5 import java.sql.ResultSet;
  6 import java.sql.Statement;
  7 import java.util.Scanner;
  8 
  9 public class News {
 10     public static void main(String[] args) {
 11         System.out.println("< < < < < < 使用ArrayList实现新闻管理系统 > > > > > >");
 12 
 13         while (true) {
 14             Scanner scanner = new Scanner(System.in);
 15             System.out
 16                     .println("1. 查询全部新闻n2. 添加新闻n3. 删除新闻n4. 按标题查询新闻n5. 按标题修改新闻 n0.退出n请选择功能(1,2,3,4,5,0):");
 17             int selected = scanner.nextInt();
 18 
 19             switch (selected) {
 20             case 1:
 21                 reads();
 22                 break;
 23 
 24             case 2:
 25                 System.out.println("请输入新闻标题:");
 26                 String title = scanner.next();
 27                 System.out.println("请输入新闻内容:");
 28                 String content = scanner.next();
 29                 System.out.println("请输入新闻备注:");
 30                 String remark = scanner.next();
 31 
 32                 add(title, content,remark);
 33                 break;
 34 
 35             case 3:
 36                 System.out.println("请输入新闻标题:");
 37                 String title2 = scanner.next();
 38                 delete(title2);
 39                 break;
 40 
 41             case 4:
 42                 System.out.println("请输入新闻标题:");
 43                 String title1 = scanner.next();
 44                 read(title1);
 45                 break;
 46 
 47             case 5:
 48                 System.out.println("请输入新闻标题:");
 49                 String title3 = scanner.next();
 50                 update(title3);
 51                 break;
 52 
 53             case 0:
 54                 scanner.close();
 55                 System.exit(0);
 56                 break;
 57 
 58             default:
 59                 System.out.println("输入错误,请重新输入:");
 60                 break;
 61             }
 62         }
 63     }
 64 
 65     /**
 66      * 定义添加新闻方法
 67      * 
 68      * @param title
 69      *            标题
 70      * @param content
 71      *            内容
 72      */
 73     public static void add(String title, String content,String remark) {
 74         try {
 75             Class.forName("com.mysql.jdbc.Driver");
 76             String url = "jdbc:mysql://localhost:3306/test";
 77             String user = "root";
 78             String password = "root";
 79             Connection conn = DriverManager.getConnection(url, user, password);
 80             Statement st = conn.createStatement();
 81             String sql = "insert into news values(null,'" + title + "','"
 82                     + content + "','"+ remark + "')";
 83             int row = st.executeUpdate(sql);
 84             System.out.println(row > 0 ? "添加成功" : "添加失败");
 85         } catch (Exception e) {
 86             e.printStackTrace();
 87         }
 88     }
 89 
 90     /**
 91      * 定义查询全部方法
 92      */
 93     public static void reads() {
 94         try {
 95             Class.forName("com.mysql.jdbc.Driver");
 96             String url = "jdbc:mysql://localhost:3306/test";
 97             String user = "root";
 98             String password = "root";
 99             Connection conn = DriverManager.getConnection(url, user, password);
100             Statement st = conn.createStatement();
101             String sql = "select * from news";
102             ResultSet list = st.executeQuery(sql);
103             if (list != null) {
104                 while (list.next()) {
105                     int id = list.getInt(1);
106                     String title = list.getString(2);
107                     String content = list.getString(3);
108                     String remark = list.getString(4);
109                     System.out.println(id + "t" + title + "t" + content
110                             + "t" + remark);
111                 }
112             }
113         } catch (Exception e) {
114             e.printStackTrace();
115         }
116     }
117 
118     /**
119      * 定义根据标题查询新闻的方法
120      * 
121      * @param title1
122      *            新闻标题
123      */
124     public static void read(String title1) {
125         try {
126             Class.forName("com.mysql.jdbc.Driver");
127             String url = "jdbc:mysql://localhost/test";
128             String user = "root";
129             String password = "root";
130             Connection conn = DriverManager.getConnection(url, user, password);
131             Statement st = conn.createStatement();
132             String sql = "select * from news where title='" + title1 + "'";
133             ResultSet row = st.executeQuery(sql);
134             if (row.next()) {
135                 int id = row.getInt(1);
136                 String title = row.getString(2);
137                 String content = row.getString(3);
138                 String remark = row.getString(4);
139                 System.out.println(id + "t" + title + "t" + content + "t"
140                         + remark);
141             }
142         } catch (Exception e) {
143             e.printStackTrace();
144         }
145     }
146 
147     /**
148      * 定义按标题删除新闻的方法
149      * 
150      * @param title
151      *            新闻方法
152      */
153     public static void delete(String title) {
154         try {
155             Class.forName("com.mysql.jdbc.Driver");
156             String url = "jdbc:mysql://localhost:3306/test";
157             String user = "root";
158             String password = "root";
159             Connection conn = DriverManager.getConnection(url, user, password);
160             Statement st = conn.createStatement();
161             String sql = "delete from news where title='" + title + "'";
162             int row = st.executeUpdate(sql);
163             System.out.println(row > 0 ? "删除成功" : "删除失败");
164         } catch (Exception e) {
165             e.printStackTrace();
166         }
167     }
168 
169     /**
170      * 定义根据标题修改新闻的方法
171      * 
172      * @param title
173      *            新闻标题
174      */
175     public static void update(String title) {
176 
177         try {
178             Class.forName("com.mysql.jdbc.Driver");
179             String url = "jdbc:mysql://localhost:3306/test";
180             String user = "root";
181             String password = "root";
182             Connection conn = DriverManager.getConnection(url, user, password);
183             Statement st = conn.createStatement();
184             String sql = "select * from news where title='" + title + "'";
185             ResultSet list = st.executeQuery(sql);
186             if (list.next()) {
187                 Scanner sca = new Scanner(System.in);
188                 System.out.println("请输入新的新闻标题:");
189                 String title4 = sca.next();
190                 System.out.println("请输入新闻内容:");
191                 String content = sca.next();
192                 System.out.println("请输入备注:");
193                 String remark = sca.next();
194                 
195                 String sql1 = "update news set title='" + title4
196                         + "',content='" + content + "',remark='" + remark + "' where title='"+title+"'";
197                 System.out.println(sql1);
198                 int u = st.executeUpdate(sql1);
199                 System.out.println(u > 0 ? "修改成功" : "修改失败");
200                 sca.close();
201             }
202         } catch (Exception e) {
203             e.printStackTrace();
204         }
205     }
206 }

但没看到有人在 mysql8.0 功能需求时提问题出来 , 自己也没有提出来 

图片 2

 

唯有自己解释 frm 文件,获取表字段名称,字段出来, 然后对应一下贴贴贴上去翻译出binlog的sql语句咯 ,并不是高深东西 , 仅此日记记录

使用

要想知道当前有多少事务没有结束:@@TranCount 。

举例1:设置隐式事务关闭,虽然默认是关的。剩下多少事务没有结束。

--创建一个表
go  
IF (OBJECT_ID(N'dbo.t1',N'U') IS NOT NULL) DROP TABLE dbo.t1;  
go  
CREATE table dbo.t1 (a int);  
go  

--设置隐式事务为关闭,其实默认就是关的.
SET IMPLICIT_TRANSACTIONS OFF; 

--插入两条数据
INSERT INTO dbo.t1 VALUES (11);  
INSERT INTO dbo.t1 VALUES (12);  

--查看有多少条事务没有结束
PRINT N' @@TranCount, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  


--结果 @@TranCount, after INSERTs, == 0

如果不开启隐式事务,事务结束都是自动的。除非用 Begin Transaction。

--设置隐式事务为关闭,其实默认就是关的.
SET IMPLICIT_TRANSACTIONS OFF; 

--开始事务
BEGIN TRANSACTION; 
--插入两条数据
INSERT INTO dbo.t1 VALUES (11);  
INSERT INTO dbo.t1 VALUES (12);  
--查看有多少条数据没有关闭
PRINT N'@@TranCount, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10)); 

--结果 @@TranCount, after INSERTs, == 1

--结束事务
COMMIT TRANSACTION;
--查看有多少条数据没有关闭
PRINT N' @@TranCount, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  

--结果 @@TranCount, after INSERTs, == 0 

 

举例2:

--设置隐式事务开启
SET IMPLICIT_TRANSACTIONS ON;  
--插入两条 删除一条
INSERT INTO dbo.t1 VALUES (21); 
INSERT INTO dbo.t1 VALUES (22); 
delete from dbo.t1
PRINT N'[B.03] @@TranCount, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  
--提交一个事务
COMMIT TRANSACTION;  
PRINT N'[B.04] @@TranCount, after COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  
go  

--结果 
--[B.03] @@TranCount, after INSERTs, == 1
--[B.04] @@TranCount, after COMMIT, == 0

 

SET IMPLICIT_TRANSACTIONS ON;  
go  
--开启事务
BEGIN TRANSACTION;  
--进行添加 删除操作
INSERT INTO dbo.t1 VALUES (31);  
INSERT INTO dbo.t1 VALUES (32);  
delete from dbo.t1
PRINT N'[C.03] @@TranCount, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  
go  
--提交事务
COMMIT TRANSACTION;  
PRINT N'[C.04] @@TranCount, after a COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  
--提交事务
COMMIT TRANSACTION;  
PRINT N'[C.05] @@TranCount, after another COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  
go  

--[C.03] @@TranCount, after INSERTs, == 2
--[C.04] @@TranCount, after a COMMIT, == 1
--[C.05] @@TranCount, after another COMMIT, == 0

 

 

隐式事务不怎么用,除非 SET ANSI_DEFAULTS (Transact-SQL).

参考官网:

图片 3

0000 ~ 0001: FE 01 识别是否frm文件 , 固定

0002: 0A 是mysql版本识别位置table.cc 的 FRM_VER+3+ MY_TEST(create_info->varchar);  为6是5.0+版本mysql , 9 或者 10是有varchar的frm文件

0003: 0C 影射枚举值从 handler.h文件中 legacy_db_type , 0C 是 12 刚刚好是innodb类型 ,如下:

enum legacy_db_type
{
DB_TYPE_UNKNOWN=0,DB_TYPE_DIAB_ISAM=1,

......, DB_TYPE_INNODB,
......
};

0004 ~ 0005: 03 00 , 反着看 00 30  mysql 5.0+ 总是为3 ,如果不是3,那就算了.....

0006 ~ 0007: 00 10 , 反着看 10 00  IO_SIZE: 4096

0008 ~ 0009: 01 00 暂时不知道是什么 

000a ~ 000d: 00 40 00 00 暂时不知道是什么 

000e ~ 000f: F9 16 tmp_key_length;如果等于0xffff然后密钥长度是4字节整数偏移0x002f

0010 ~ 0011: 18 08 rec_length ;这是一个默认值存储字符串的字节

0012 ~ 0015: 00 00 00 00 是 create table 语句的 MAX_ROWS 选项

0016 ~ 0019: 00 00 00 00 是 create table 语句的 min_rows 选项 , 在 handler.h 文件

 

typedef struct st_ha_create_information
{

.......

ulonglong max_rows,min_rows;

...}

本文由澳门新葡亰平台官网发布于数据库,转载请注明出处:为了解决mysqlbing翻译表字段问题而分析frm文件,

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。