feat(mysql)!: promote to v1.0.0 — BeginTx with isolation levels, Stats, bump all deps to v1.0.0

Add BeginTx(ctx, *sql.TxOptions) to Client interface for explicit transaction isolation
level control; Begin refactored as a convenience wrapper calling BeginTx(ctx, nil).
Add Stats() sql.DBStats to Component interface for connection pool observability.
Bump all micro-lib dependencies (logz, health, launcher, xerrors) from v0.9.0 to v1.0.0.
API committed as stable.
This commit is contained in:
2026-05-11 19:16:51 -06:00
parent 9d8762458c
commit f43fc8056c
5 changed files with 73 additions and 18 deletions

View File

@@ -99,9 +99,10 @@ func (m *mockTx) Rollback() error
type mockClient struct{ tx *mockTx }
func (m *mockClient) Begin(ctx context.Context) (Tx, error) { return m.tx, nil }
func (m *mockClient) Ping(ctx context.Context) error { return nil }
func (m *mockClient) HandleError(err error) error { return HandleError(err) }
func (m *mockClient) Begin(ctx context.Context) (Tx, error) { return m.tx, nil }
func (m *mockClient) BeginTx(ctx context.Context, opts *sql.TxOptions) (Tx, error) { return m.tx, nil }
func (m *mockClient) Ping(ctx context.Context) error { return nil }
func (m *mockClient) HandleError(err error) error { return HandleError(err) }
func (m *mockClient) GetExecutor(ctx context.Context) Executor {
if tx, ok := ctx.Value(ctxTxKey{}).(Executor); ok {
return tx
@@ -143,6 +144,24 @@ func TestUnitOfWork_InjectsExecutor(t *testing.T) {
}
}
// --- BeginTx / Stats ---
func TestComponent_BeginTx_NilDB(t *testing.T) {
c := &mysqlComponent{logger: newLogger()}
_, err := c.BeginTx(context.Background(), nil)
if err == nil {
t.Error("expected error for nil db")
}
}
func TestComponent_Stats_NilDB(t *testing.T) {
c := &mysqlComponent{logger: newLogger()}
stats := c.Stats()
if stats.MaxOpenConnections != 0 || stats.OpenConnections != 0 {
t.Errorf("expected zero DBStats, got %+v", stats)
}
}
// --- helpers ---
func assertCode(t *testing.T, err error, want xerrors.Code) {